【问题标题】:Splitting this string to get the max count to a corresponding character拆分此字符串以获得对应字符的最大计数
【发布时间】:2019-05-18 16:06:18
【问题描述】:

我目前正在为文本压缩实现运行长度编码,我的算法确实返回以下形式的字符串:

假设我们有一个字符串作为输入

"AAAAABBBBCCCCCCCC"

然后我的算法返回

"1A2A3A4A5A1B2B3B4B1C2C3C4C5C6C7C8C"

现在我想应用Java String split 来解决这个问题,因为我想得到字符对应的最大数字。对于我们的示例,它将是

"5A4B8C"

下面可以看到我的功能

public String getStrfinal(){

    String result = "";
    int counter = 1;
    StringBuilder sb = new StringBuilder();
    sb.append("");
    for (int i=0;i<str.length()-1;i++) {
        char c = str.charAt(i);
        if (str.charAt(i)==str.charAt(i+1)) {
            counter++;
            sb.append(counter);
            sb.append(c);
        }
        else {
            counter = 1;
            continue;
        }
    }
    result = sb.toString();
    return result;
}

【问题讨论】:

  • 我有一个更新的答案,它处理字符串行中的数字看看

标签: java string run-length-encoding


【解决方案1】:
public static String getStrfinal(){

    StringBuilder sb = new StringBuilder();

    char last = 0;
    int count = 0;
    for(int i = 0; i < str.length(); i++) {

        if(i > 0 && last != str.charAt(i)) {
            sb.append(count + "" + last);
            last = 0;
            count = 1;
        }
        else {
            count++;
        }

        last = str.charAt(i);

    }
    sb.append(count + "" + last);
    return sb.toString();
}

【讨论】:

    【解决方案2】:

    这是一种可能的解决方案。它从原始字符串开始,然后简单地遍历字符串。

       public static void main(String[] args) {
          String input = "AAAABBBCCCCCCCDDDEAAFBBCD";
          int index = 0;
          StringBuilder sb = new StringBuilder();
          while (index < input.length()) {
             int count = 0;
             char c = input.charAt(index);
             for (; index < input.length(); index++) {
                if (c != input.charAt(index)) {
                   count++;
                }
                else {
                   break;
                }
             }
             sb.append(Integer.toString(count));
             sb.append(c);
             count = 0;
          }
          System.out.println(sb.toString());
       }
    

    但是这种方法和其他方法的一个问题是如果文本中有数字会发生什么?例如。如果字符串是AAABB999222AAA 会压缩成3A2B39323A 怎么办。这也可能意味着AAABB 后跟39 3's23 A's

    【讨论】:

    • 我已经更新了我的答案(包括数字计数),看看是否还可以
    【解决方案3】:

    您可以使用地图而不是字符串缓冲区,这样做会更容易和干净。

    public static void main(String[] args)  {   
        String input = "AAAAABBBBCCCCCCCCAAABBBDDCCCC";
        int counter=1;
        for(int i=1; i<input.length(); i++) {
            if(input.charAt(i-1)==input.charAt(i)) {
                counter=counter+1;
            }else if(input.charAt(i-1)!=input.charAt(i)){
                System.out.print(counter+Character.toString(input.charAt(i-1)));
                counter=1;
            }if(i==input.length()-1){
                System.out.print(counter+Character.toString(input.charAt(i)));
            }
        }   
    }
    

    这会给

    5A4B8C3A3B2D4C
    

    更新
    我同意@WJS,如果字符串包含数字,则输出会变得混乱 因此,如果上面代码中的 System.out 将与下面交换,即

    System.out.print(Character.toString(input.charAt(i-1))+"="+counter+" ");
    

    然后输入像

    AAAAABBBBCCCCCCCCAAABBBDD556677CCCCz
    

    我们得到如下结果

    A=5 B=4 C=8 A=3 B=3 D=2 5=2 6=2 7=2 C=4 z=1
    

    【讨论】:

    • 如果您认为该答案为您提供了一个干净且更好的解决方案,您可以接受。
    • 您对AAAAABBBBCCCCCCCCAAA 的回答失败。他正在尝试做一个压缩算法。您的方法给出了8A4B8C,并将扩展为AAAAAAAABBBBCCCCCCCC
    • @WJS 我已经进行了整改 :) 谢谢我没有注意到它和压缩逻辑。
    • 更新的打印语句需要在两个地方添加适当的charAt调整。解决了我提到的数字问题。
    • @WJS 我确实看到了更新示例 AAAAABBBBCCCCCCCCAAABBBDD556677CCCCz 它也有编号,并且使用我指定要替换的打印语句处理了结果。
    【解决方案4】:

    这是您问题的可能解决方案之一。我们可以使用类似于 HashMap 但也保持顺序的 LinkedHashMap 数据结构。因此,我们可以遍历字符串并将每个字符的出现作为键值对存储到映射中,并轻松检索其最大出现次数。

    public String getStrFinal(String str){
        if(str==null || str.length()==0) return str;
        LinkedHashMap<Character,Integer> map = new LinkedHashMap<>();
        StringBuilder sb=new StringBuilder(); // to store the final string
        for(char ch:str.toCharArray()){
            map.put(ch,map.getOrDefault(ch,0)+1);  // put the count for each character
        }
        for(Map.Entry<Character,Integer> entry:map.entrySet()){  // iterate the map again and append each character's occurence into stringbuilder
            sb.append(entry.getValue());
            sb.append(entry.getKey());
        }
    
        System.out.println("String = " + sb.toString()); // here you go, we got the final string
        return sb.toString();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2017-11-04
      • 2014-12-23
      相关资源
      最近更新 更多