作为新手,我找不到程序中的错误
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)有效。这可能是您的计数器存储错误值的唯一原因。
我正在训练代码战争套路,套路是:
在工厂里,一台打印机为箱子打印标签。对于一种盒子,打印机必须使用颜色,为了简单起见,这些颜色用 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)有效。这可能是您的计数器存储错误值的唯一原因。