如何在号码内找到最受欢迎的数字。例如,我的号码是222244,最常出现的数字是2.请帮忙。
我有类似的东西,但是我真的不明白这个方法的第一部分,int j = liczba.charAt(i) - 47;
为什么47在这里发生了什么?谁能解释一下呢?
int digits[] = new int [10];
for(int i = 0; i <liczba.length(); i++){
int j = liczba.charAt(i) - 47;
digits[j]++;
}
int digit = 0;
int count = digits[0];
for(int i=1;i <10; i++){
if(digits[i] >count){
count = digits[i];
digit = i;
}
}
return digit;
答案 0 :(得分:1)
该行
int j = liczba.charAt(i) - 47;
将第(i + 1)个字符liczba
的字符代码减去47.参考ASCII table,47映射到“/”,其ASCII码小于“0”。
请注意,我假设以下内容,因为您的代码似乎是Java格式。
char
类型实际上是一个整数类型,范围更小因此,此代码将字符“0”变为整数1,将“1”变为整数2等。
例如,当第一个字符(liczba.charAt(0)
)是字符0
时,liczba.charAt(0)
会返回字符'0'
,这也等于数字48
- 因为'0'
的ASCII码为48.
减去48,其中47得1,所以它会将字符'0
'转换为整数1.
然而似乎此代码可能导致数组索引超出边界错误(假设从零开始的数组索引)。当数字为'9'
时,该行返回10.这将导致上述错误。除非此代码的语言数组是基于1的。但是,即便在这种情况下,这一行
int count = digits[0];
会失败。此代码似乎因公共Off by one error
而失败我相信这一行实际应该是
int j = liczba.charAt(i) - 48;
以便将字符'0'
转换为数字0。
如果仍然打扰您,您可以将此行更改为
int j = liczba.charAt(i) - '0';
所以它会更清楚。减去'1'
的代码,'0'
的代码得到整数1,足够清楚了:)