【问题标题】:Run Length Encoding in Java - unintended outputJava中的运行长度编码 - 意外输出
【发布时间】:2018-12-12 08:46:23
【问题描述】:

我被指派为我的 Java 班级完成一项任务。它基本上是一个运行长度编码程序,它会遍历输入的字符串并对其进行压缩,(例如:aaabbb 变为 a4b3)

流程:

我的代码遍历输入字符串中的每个字符并检查原始字符是否等于下一个字符。如果它为真,它会增加计数并最终连接计数和原始字母。如果原始字母不等于下一个字符 - 它从 1 开始计数并启动一个新的 for 循环。如果 for 循环中的字符等于位置 i 中的字符,则它会增加计数,直到下一个字母不等于前一个字母。重复此过程,直到读取输入中的所有字符。

我尝试编写以下代码:

import java.util.Scanner;

class RLE {
    RLE() {
        Scanner sc = new Scanner(System.in);
        String input = sc.next();
        int count = 0;

        for (char c : input.toCharArray()) {
            if (input.charAt(0) == c) {
                count++;
                input = input.charAt(0) + Integer.toString(count);
            }

            else {

                count = 1;

                for (int i = 0; i < input.length(); i++) {

                    if (c == input.charAt(i)) {
                        count++;
                    }
                }

                input = input.concat(c + Integer.toString(count));
            }
        }

        System.out.println(input);

    }
}

示例

这是我的以下输入:aaabbbccc

实际输出:a3b1b2b3c1c2c3

预期输出:a3b3c3

有人可以解释一下我做错了什么吗?我尝试用不同的方法重做代码,但没有成功。我最好的猜测是原始输入字符串被扩展,因此扩展了原始 for 循环,但这也可能是错误的。非常感谢!

【问题讨论】:

    标签: java loops compression


    【解决方案1】:

    首先,您不应将变量输入用于输入和输出。它使阅读变得困难,并且可能会产生错误。比你应该检查一个空输入。之后,您只需要一个循环来选择一个角色,并将其与以下几个进行比较。如果相同,则增加一个计数器,如果不将其与计数一起添加到输出,则重置字符和计数器并继续。最后你必须检查是否还有一些休息。

    import java.util.Scanner;
    
    class RLE {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.next();
        int count = 0;
    
        String output = "";
        if (!input.isEmpty()) {
            char actual = input.charAt(0);
            for (char c : input.toCharArray()) {
                if (actual == c) {
                    count++;
                } else {
                    output += actual + Integer.toString(count);
                    actual = c;
                    count = 1;
                }
            }
            if (count > 0) {
                output += actual + Integer.toString(count);
            }
        }
        System.out.println(output);
    
    }
    }
    

    【讨论】:

      【解决方案2】:

      另一种选择是这样做:

          Scanner sc = new Scanner(System.in);
          String input = sc.next();
          StringBuilder builder = new StringBuilder();
      
          char c = input.charAt(0);
          int count = 0;
          for (int i = 0; i < input.length(); i++) {
              if (!Objects.equals(c, input.charAt(i))) {
                  builder.append(c);
                  builder.append(count);
                  c = input.charAt(i);
                  count = 1;
              } else {
                  count++;
              }
              if (input.length() - 1 == i) {
                  builder.append(c);
                  builder.append(count);
              }
          }
      
          System.out.println(builder.toString());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-11
        • 1970-01-01
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-27
        • 1970-01-01
        相关资源
        最近更新 更多