如何找到大多数出现的数字

时间:2013-08-17 13:45:00

标签: java numbers digit

如何在号码内找到最受欢迎的数字。例如,我的号码是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;

1 个答案:

答案 0 :(得分:1)

该行

int j = liczba.charAt(i) - 47;

将第(i + 1)个字符liczba的字符代码减去47.参考ASCII table,47映射到“/”,其ASCII码小于“0”。

请注意,我假设以下内容,因为您的代码似乎是Java格式。

  • 字符串索引从零开始,即第一个字符的索引为0,第二个字符的索引为1,依此类推
  • 字符和整数似乎可以互换使用,因为字符在内部由整数表示,即字符的ASCII码。
  • 也就是说,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,足够清楚了:)