0

我正在训练代码大战 kata,而 kata 是:

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

打印机使用的颜色记录在控制字符串中。例如,一个“好”的控制字符串是 aaabbbbhaijjjm,这意味着打印机使用了 3 次颜色 a、4 次颜色 b、1 次颜色 h 和 1 次颜色 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 个数字。任何人都可以帮忙吗?

4

2 回答 2

1

实际上,您可以使用<and>来检查字符是否在 java 中的某个范围内。您的逻辑是合理的 - 但是由于您是“新手”,因此您已经使用 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());
    }
于 2020-01-03T17:38:18.040 回答
0

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

if(s.charAt(i) > end )

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

于 2020-01-03T17:42:19.727 回答