输入整数到字符数组 - Java

5

最近我尝试参加HackerRank挑战,涉及计算数字的空洞并将它们相加,在一番研究后,我最终将其转化为字符数组,并选择三个值进行递增,并将它们相加得到总和,如下所示:

 public static int countHoles(int num) {

    //create integers that count how many a number with no, one or two holes shows up
    Integer noHoles = 0;
    Integer oneHole = 0; 
    Integer twoHoles = 0; 
    Integer sum = 0;
    Integer length = 0;

    //turn the inputted number into a char array
    char [] digits = String.valueOf(num).toCharArray();
    System.out.println(digits);
    length = digits.length;

    //These nested loops incremement the numbers initialized above as the first for-each loop goes through each index value of the array
    for (int i = 0; i < digits.length; i++){
        if (digits[i]== 1 || digits[i]==2 || digits[i]==3 || digits[i]==5 || digits[i]==7){
            noHoles++;
        } else if (digits[i]==4 || digits[i]==6 || digits[i]==9 || digits[i]==0){
            oneHole+= 1;
        } else if (digits[i]==8){
            twoHoles+= 2;
        }

    }
    //add up the incremented integers. twoHoles is doubled as each unit counts as two holes and noHoles is 0 regardless of its values
    sum = oneHole + twoHoles;
    return sum;
    }
}

但是字符数组总是返回一个普通整数!我无法尝试模数方法,因为0被使用(有一个洞),以及一堆对String.valueOf(num).toCharArray()的变体,如("" + num).toCharArray()和Integer.toString(number).toCharArray(),但它仍然输出输入的数字而不是想要的字符数组。当然,由于空数组,该方法的其余部分都会输出0。

我有点新手,但这真让人沮丧。我感觉这是一个微小的细节,我没有看到或者不知道,而不是我的逻辑问题。请帮帮我好吗?


你希望输出什么?(在打印数组时,也要使用 Arrays.toString - GBlodgett
2个回答

3

您正在使用不正确的 int 值(例如,'1' != 1)将一个 char 与一个 int 进行比较。更安全的做法是将 charchar 进行比较:

if (digits[i] == '1' || digits[i] == '2' || digits[i] == '3' || digits[i] == '5' || digits[i] == '7') {
    noHoles++;
} else if (digits[i] == '4' || digits[i] == '6' || digits[i] == '9' || digits[i] == '0') {
    oneHole += 1;
} else if (digits[i] == '8') {
    twoHoles += 2;
}

你也不需要noHoles变量,因为在递增后未使用。如果删除noHoles,还可以删除第一个if语句,其中检查数字是否为12等。

此外,要打印char[],请使用Arrays#toString

System.out.println(Arrays.toString(digits));

非常感谢!我知道我错过了一个小细节!我打算使用noHoles来打印有多少数字没有洞,这个方法也很好用。再次感谢!您为什么建议我使用Arrays#toString打印输出呢?我以前从未见过这种方法,但即使不使用它,程序也能正常运行。 - Syz
1
@T.Bifo 嗯,Arrays#toString 是你用来打印数组的方法。在这种情况下,System.out.println 适用是因为有一个重载方法可以接受 char[]。但是当你使用不同类型的数组时,你就不会那么幸运了! - Jacob G.
1
哦,我明白了,这是关于正确编码的技巧!我会记住的,以后会注意的 :) - Syz

1

首先,由于digits[i]是一个char类型的变量,你需要在测试中添加一些引号,才能进行比较。 digits[i]=='1' 是正确的写法。 例如:

    char five = '5';
    if (five == 5) {
        System.out.println("They are similar");
    } else {
        System.out.println("They are not similar");
    }

打印不相似。

其次,System.out.println(digits)会调用print(char[] s)然后是println(),如果您查看print(char[] s)的javadoc,它说:

打印字符数组。根据平台的默认字符编码将字符转换为字节,并以与write(int)方法完全相同的方式写入这些字节。

因此,它执行逐字节打印。所以它打印整数是正常的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接