Как новичок не могу найти ошибку в программе
Я тренировал ката кодовых войн, и ката было:
На фабрике принтер печатает этикетки для коробок. Для одного вида ящиков принтер должен использовать цвета, которые для простоты обозначены буквами от a до m.
Цвета, используемые принтером, записываются в контрольную строку. Например, "хорошей" контрольной строкой будет aaabbbbhaijjjm, что означает, что принтер использовал три раза цвет a, четыре раза цвет b, один раз цвет h, затем один раз цвет a...
Иногда возникают проблемы: отсутствие цветов, техническая неисправность и "плохая" контрольная строка, например, aaaxbbbbyyhwawiwjjjwwm с буквами не от a до m.
Вам нужно написать функцию printer_error, которая для данной строки будет выводить частоту ошибок принтера в виде строки, представляющей рациональное число, числитель которого является количеством ошибок, а знаменатель - длиной контрольной строки. Не уменьшайте эту дробь до более простого выражения.
Строка имеет длину больше или равна единице и содержит только буквы от 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;
}
}
Тест прошел, но при отправке Ката на счетчике отсутствовали 1 или 2 числа. Кто-нибудь может помочь?
2 ответа
На самом деле вы можете просто использовать <
а также >
чтобы проверить, находится ли символ в некотором диапазоне в java. Ваша логика верна, но поскольку вы "новичок", вы воссоздали функциональность цикла for с помощью цикла while. В этом нет необходимости - поэтому у нас есть циклы 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. Обратите внимание, что вы считаете это ошибкой только в том случае, если значение символа ASCII больше 110, что означает, что ваш код будет принимать 'n' (значение ASCII которого равно 110) как действительное. Это может быть единственной причиной, по которой ваш счетчик хранит неправильное значение.