繁体   English   中英

Java字符串压缩输出错误的字符串。 我在这里想念什么?

[英]Java string compression is printing wrong string. What am I missing here?

我有一个字符串“ aaabbaaaavvvd”,应该将其压缩为a3b2a4v3d,但是当我运行我的代码时,它会打印出b3a2v4d3

奇怪的是,它以b而不是a开头

public class compression {
    public String compress(String str){
        char chararr[] = str.toCharArray();
        StringBuilder sb = new StringBuilder();
        int count=1;
        char previous = chararr[0];
        for(int i=1; i<chararr.length; i++) {
             char current = chararr[i]; 
             if(current == previous){
                 count++;
             } else {
                 sb.append(current).append(count);
                 count = 1;
             }
             previous = current;
        }
        System.out.println(sb.toString());
        return sb.toString();
    }

    public static void main(String args[]){
        compression test = new compression();
        String str = "aaabbaaaavvvd";
        test.compress(str);
    }
}

在线错误:

sb.append(current).append(count);

考虑一下if语句

if(current == previous){
    count++;
} else {
    sb.append(current).append(count);
    count = 1;
}

当您的代码遍历每个字符时,如果当前字符不等于最后一个字符(即, 当前字符是新字符序列的开始),则if语句仅为false。

一步一步走:

Index 1: previous == 'a', current == 'a', if-statement: true - increments
Index 2: previous == 'a', current == 'a', if-statement: true - increments
Index 3: previous == 'a', current == 'b', if-statement: false - prints and reset

请注意,在第三个索引上, currentb而不是必需的字符a ,从而输出b3而不是a3

替换追加链previous解决:

if(current == previous){
    count++;
} else {
    sb.append(previous).append(count);
    count = 1;
}

您有3个问题:

  1. current == previous您应该在计数器上加1,然后continue
  2. 退出循环时-打印您处理的最后一个字符
  3. 您应该附加上一个字符-而不是当前sb.append(previous)

您的代码应如下所示:

        public String compress(String str){
        char chararr[] = str.toCharArray();
        StringBuilder sb = new StringBuilder();
        int count=1;
        char previous = chararr[0];
        for(int i=1; i<chararr.length; i++) {
            char current = chararr[i];
            if(current == previous){
                count++;
                continue;
            } else {
                sb.append(previous).append(count);
                count = 1;
            }
            previous = current;
        }

        sb.append(previous).append(count);
        System.out.println(sb.toString());
        return sb.toString();
    }

此代码示例有效。 我已经将sb.append(current)更改为sb.append(previous),并在for循环外添加了sb.append(previous).append(count)以解决最后一个字符

public class compression {
public String compress(String str){
    char chararr[] = str.toCharArray();
    StringBuilder sb = new StringBuilder();
    int count=1;
    char previous = chararr[0];
    for(int i=1; i<chararr.length; i++) {
         char current = chararr[i]; 

         if(current == previous){
             count++;
         } else {
             sb.append(previous).append(count);
             count = 1;
         }

         previous = current;
    }

    sb.append(previous).append(count);

    System.out.println(sb.toString());
    return sb.toString();
}

public static void main(String args[]){
    compression test = new compression ();
    String str = "aaabbaaaavvvd";
    test.compress(str);
}

}

尝试这个:

public class Compression {
    public String compress(String str) {
        char chararr[] = str.toCharArray();
        StringBuilder sb = new StringBuilder();
        int count = 0;
        char previous = chararr[0];
        for (int i = 0; i < chararr.length; i++) {
            char current = chararr[i];
            if (current == previous) {
                count++;
            } else {
                sb.append(previous);
                if (count != 1) {
                    sb.append(count);
                }
                count = 1;
            }
            previous = current;
        }

        sb.append(previous);
        if (count != 1) {
            sb.append(count);
        }
        return sb.toString();
    }

    public static void main(String args[]) {
        Compression test = new Compression();
        System.out.println(test.compress("aaabbaaaavvvd"));
        System.out.println(test.compress("aaabbaaaavvvdddd"));
    }
}

输出:

a3b2a4v3d
a3b2a4v3d4

尝试如下所示:

public String compress(String str){

    String result="";
    StringBuilder sb = new StringBuilder(str);


    while(sb.length() != 0){
        int count = 0;
        char test = sb.charAt(0);
        while(sb.indexOf(test+"") != -1){
            sb.deleteCharAt(sb.indexOf(test+""));
            count++;
        }
        result=result+test+count;
    }
    System.out.println(result); 

    return sb.toString();
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM