作为新手,我找不到程序中的错误

As a newbie I can't find the bug in the program

我正在训练代码战争套路,套路是:

在工厂里,一台打印机为箱子打印标签。对于一种盒子,打印机必须使用颜色,为了简单起见,这些颜色用 a 到 m 的字母命名。

打印机使用的颜色记录在控制字符串中。例如,一个“好的”控制字符串将是 aaabbbbhaijjjm,这意味着打印机使用了三次颜色 a、四次颜色 b、一次颜色 h 然后一次颜色 a...

有时会出现问题:缺少颜色、技术故障和生成“错误的”控制字符串,例如aaaxbbbbyyhwawiwjjjwwm 字母不是从 a 到 m。

你必须编写一个函数 printer_error 给定一个字符串,它将打印机的错误率输出为一个表示有理数的字符串,该有理数的分子是错误数,分母是控制字符串的长度.不要将这个分数简化为更简单的表达式。

字符串的长度大于或等于 1,并且只包含从 a 到 z 的字母。

示例:

s="aaabbbbhaijjjm"
error_printer(s) => "0/14"

s="aaaxbbbbyyhwawiwjjjwwm"
error_printer(s) => "8/22"

作为新手,我尝试过。我的程序是这样的:

public class Printer {
    
    public static String printerError(String s) {
      int printErr = 0;
      char end = 110;
      int i = 0;
        while (i < s.length()){
          if(s.charAt(i) > end ){
          printErr++;
          }
          i++;
        }
        String rate = String.format("%d/%d",printErr , s.length());
        return rate;
    }
}

它通过了测试,但在提交 Kata 时,计数器缺少 1 或 2 个数字。有人可以帮忙吗?

您实际上可以只使用 <> 来检查字符是否在 java 的某个范围内。您的逻辑是合理的 - 但由于您是 "newbie",您已经使用 while 循环重新创建了 for 循环的功能。不需要这样做 - 这就是我们有 for 循环的原因。

调整方法见下:

    public String printerError(String s) {
        int printErr = 0;

        for (int i = 0; i < s.length(); i++) {
            // assuming the input rules hold true, we really only need the second condition
            if (s.charAt(i) < 'a' || s.charAt(i) > 'm') {
                printErr++;
            }
        }

        return String.format("%d/%d", printErr, s.length());
    }

这是一个新手给另一个的回答:p,所以我的回答可能有点不对。据我了解,您在 if 条件中犯了一个愚蠢的逻辑错误。

if(s.charAt(i) > end )

您使用了 ASCII 值,分配如下:a-97、b-98、c-99...、m-109。 请注意,只有当 character 的 ASCII 值大于 110 时,您才将其计算为错误,这意味着您的代码将接受 'n' (其 ASCII 值为 110)有效。这可能是您的计数器存储错误值的唯一原因。