我一直在搜索这个游戏的源代码并找到了这个。但是,我没有理解代码末尾的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;
答案 0 :(得分:0)
只需制作一支笔&纸测试。我们的号码系统有10位数:0到9. digs
表示数字是否已经出现。使用num % 10
,您获得num
的最后一位数字。因此,假设num
在最不重要的位置有一个1
。这意味着:digs[i]
将设置为true
(digs[num%10] = true;
)。现在让我们来看看:num /= 10
您从整数中移除最后一位数字。例如,3211 /= 10
将是321
(整数算术,我知道你不能将/=
应用于文字,但它只是一个解释语义的演示)。由于num
为> 0
,因此循环再次执行。这一次,if
- 条件将为true
(因为我们之前将digs[1]
设置为true
一次迭代),我们发现了一个重复的数字。如果该方法能够在不输入if
的情况下离开循环,则num
具有成对不等数。就是这样。
答案 1 :(得分:0)
在游戏的上下文中,它基本上检查给定的整数num
是否有重复的数字。它通过创建一个包含10个布尔值的数组来实现,这样两个重复的数字将被放入数组中的同一个单元格中。该算法使用
num modulo 10
提取num
的最低有效位,直到检查完所有数字。同样,它使用模10,因为它假设一个基数为10的数字系统。检测到重复数字的那一刻,该方法返回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
没有。