Bulls and Cows Java代码解释

时间:2015-04-24 21:21:12

标签: java

我一直在搜索这个游戏的源代码并找到了这个。但是,我没有理解代码末尾的hasDupes方法。

你能解释一下吗?

源代码 - here

public static boolean hasDupes(int num){
    boolean[] digs = new boolean[10];
    while(num > 0){
        if(digs[num%10]) return true;
        digs[num%10] = true;
        num/= 10;
    }
    return false;

4 个答案:

答案 0 :(得分:0)

只需制作一支笔&纸测试。我们的号码系统有10位数:0到9. digs表示数字是否已经出现。使用num % 10,您获得num的最后一位数字。因此,假设num在最不重要的位置有一个1。这意味着:digs[i]将设置为truedigs[num%10] = true;)。现在让我们来看看:num /= 10从整数中移除最后一位数字。例如,3211 /= 10将是321(整数算术,我知道你不能将/=应用于文字,但它只是一个解释语义的演示)。由于num> 0,因此循环再次执行。这一次,if - 条件将为true(因为我们之前将digs[1]设置为true一次迭代),我们发现了一个重复的数字。如果该方法能够在不输入if的情况下离开循环,则num具有成对不等数。就是这样。

答案 1 :(得分:0)

在游戏的上下文中,它基本上检查给定的整数num是否有重复的数字。它通过创建一个包含10个布尔值的数组来实现,这样两个重复的数字将被放入数组中的同一个单元格中。该算法使用

  1. 一个包含10个布尔值的数组,用于表示基数为10的数字系统中的每个数字。因此,如果您正在处理基数为16的数字系统,则需要一个包含16个布尔值的数组。
  2. num modulo 10提取num的最低有效位,直到检查完所有数字。同样,它使用模10,因为它假设一个基数为10的数字系统。
  3. 检测到重复数字的那一刻,该方法返回true

    if(digs[num%10]) return true;
    

    如果您查看示例代码中的main()方法,算法将尝试继续生成随机数,直到找到没有重复数字的数字。

    while(hasDupes(target= (gen.nextInt(9000) + 1000)));
    

答案 2 :(得分:0)

让我们一步一步:

boolean[] digs = new boolean[10];

在Java中,数组声明中的所有项都被赋予默认值。如果是boolean,则为false。因此,这会创建一个包含10个元素的数组,其中每个元素都是false

while(num > 0){
    if(digs[num%10]) return true;
    digs[num%10] = true;
    num/= 10;
}

将数字修改10(num % 10)然后除以10(num/= 10)是从数字中“弹出”最后一位数字的常用方法。例如,

int someNum = "1357";
int lastDigit = mod % 10; // lastDigit is 7
someNum /= 10; // someNum is now 135

如您所见,7被删除了。因此while循环只是弹出num的每个数字,直到处理完所有数字。现在,对于要删除的每个数字,digs[num%10] = true;只是跟踪已删除的数字。通过跟踪这些内容,如果已经处理了数字,if(digs[num%10]) return true;将从方法返回true

因此,用更简单的词来说,这种方法只是检查一个数字是否包含多于1个相同的数字。

12345 will return false
12341 will return true

答案 3 :(得分:0)

它正在检查基数10中的任何值是否有重复的数字。

因此9019在写为十进制值时会有重复的数字(9)。 123没有。