有人可以逐行解释这个代码。我刚开始学习如何编码,我现在正在学习java,但是我很难执行这个函数。什么是new int[10]
;真的吗?我并没有真正得到差异,或者repeatedDigits[index]
部分与repeatedDigits[remainder]
部分的使用方式不同。
编写一个计算整数x中重复数字的函数。
例如:如果x
是999,那么你的函数必须打印回9 occurs 3 * times
。另一个例子,如果整数x是992121,那么你的函数*必须打印回9 occurs 2 times, 2 occurs 2 times and 1 occurs 2 * times
。这是该功能的指南。
public static void countRepeatedDigitsInANumber(int x) {
int[] repeatedDigits = new int[10];
while (x > 0) {
int remainder = x % 10;
x = x / 10;
repeatedDigits[remainder] = repeatedDigits[remainder] + 1;
}
int index = 0;
while (index < 10) {
if (repeatedDigits[index] != 0)
System.out.println("The digit " + index + " occurs " +
repeatedDigits[index]);
index++;
}
}
这是一个编译的代码。我只是张贴这个,因为我很难理解。我真的很感激,如果有人能提出任何建议,也可以快速学习java!
新的int [10]是什么;
它创建了一个大小为10的新数组,可以保存int
值。数组中的所有值都将初始化为0(这就是Java处理int
原语的方式)。
在这种情况下,看起来这个数组用于存储与其索引相对应的数字的次数。
嗯,打字令人困惑,阅读可能更令人困惑,所以让我举个例子。对于输入992121
,您希望在程序完成时repeatedDigits
数组看起来像这样:
[0, 2, 1, 0, 0, 0, 0, 0, 0, 2]
即两个1,一个2和两个9
while (x > 0) {
这开始一个循环,一直持续到x
等于(或小于,但不应该发生)为零。
int remainder = x % 10;
这基本上使用模运算“捕获”数字的最右边数字。它将数字除以10,任何余数都将是“一个地方”(即最右边的数字)。
x = x / 10;
这会将数字向右移一个数字,并丢弃最右边的数字(因为你已经捕获了它)。
repeatedDigits[remainder] = repeatedDigits[remainder] + 1
这只是在适当的位置增加数组中的值。例如,如果你只是从数字的右端推出一个9,这将增加repeatDigits [9]中的值,所以你知道你刚看到另外9。
int index = 0;
while (index < 10) {
我们即将做一些循环!有(在我看来)更好的方法来做到这一点,但这也适用。基本上,你希望index
从0开始,并一直循环到9,但是当你到达10时停止。
if (repeatedDigits[index] != 0)
如果repeatedDigits
数组中给定位置的值不为零,那么......
System.out.println("The digit " + index + " occurs " + repeatedDigits[index]);
... 打印出来!
index++;
最后,增加index
,以便我们检查下一个数字。这和index = index + 1
完全一样。
欢迎来到SO和Java的美丽世界!我在整个答案中都附加了超链接,可能会帮助你。
int[] repeatedDigits = new int[10];
上面的代码行是creating an array with 10 elements, from index: 0 to index: 9.
int remainder = x % 10;
上面的代码行计算remainder once 'x' has been divided by 10.例如,如果'x = 9192'那么它将除以'9192/10 = 919.2'并取余数。在这种情况下是'2'。请注意它实际上是如何反向查看数字的?所以像'9192'这样的数字实际上被处理为'2919'。
x = x / 10;
上面的代码行将数字除以10-since it's integer division it drops all decimal values.,因为我们已经计算了最后一个数字。所以'9192'现在只是'919'。
repeatedDigits[remainder] = repeatedDigits[remainder] + 1;
上面的代码行将转到我们之前存储的余数值的数组的索引。还记得我们的余数是'2'吗?它不会在我们的数组中索引:2并且将它的值加1 - 最初是0.所以现在我们在索引处的数组:2具有值:1。意味着数字2重复了1次。
我上面列出的只是代码上半部分所在的while循环的1次迭代。所以得到一张纸并重做我上面所做的一切,剩下的数字为'919'。
完成后,您应该注意到您的数组看起来像这样:
index 0: 0
index 1: 1
index 2: 1
index 3: 0
index 4 to 8: 0
index 9: 2
这意味着'1'来了一次。 '2'来了一次。 '9'来了两次。
至于学习Java的建议?经常阅读。谷歌你的每一个小问题,如果你不理解某些东西是如何工作的,那就拿一张纸写出来。
int[] repeatedDigits = new int[10];
//创建一个大小为10的整数数组
while (x > 0) {
//提供的整数大于0
int remainder = x % 10;
//获取基数为十的系统中的最小值数字。 101%10 = 1
x = x / 10;
//在十进制中,这会将数字的大小减少十几个位置。 101/10 = 10为10可以完全分为101 10次。你以这种方式丢弃了数字的最后一位数字。这将允许您退出while循环,因为最终x将等于0。
repeatedDigits[remainder] = repeatedDigits[remainder] + 1;
这里的剩余部分可以在0-9之间。这是因为余数是将提供的整数除以10的余数。您不能将大于0的数除以10并且具有小于零或大于9的值。
您创建的数组的索引为0-9,因为它是十个空格(0,1,2,3,4,5,6,7,8,9)。您将与剩余部分对应的重复数字的索引值分配给之前的任何值加1。
这意味着您发现数字中的最后一位数字等于某个值X.X必须介于0-9之间。由于你有一个索引在0-9之间的数组,你得到与repeatedDigits [X]相关的值,当你找到另一个X值时加一个,并设置repeatedDigits [X]的值等于之前的值你发现这个新的X加一个。
}
int index = 0;
从数组的第一个值开始(0)
while (index < 10) {
遍历数组的值从0到9
if (repeatedDigits[index] != 0)
如果索引处的数组repeatDigits的值不为0.这与输入数字中是否找到索引值相同。
System.out.println("The digit " + index + " occurs " +
repeatedDigits[index]);
index是我们查看的数字。它发生了多少次的计数存储在repeatedDigits [index]中。我们正在打印价值和发生的次数。
index++;
增加索引,检查下一个索引值。
}
}
让我看看我是否可以为你清理一些事情。我的第一个建议是格式化代码,以便循环中的行缩进:
public static void countRepeatedDigitsInANumber(int x) {
int[] repeatedDigits = new int[10];
while (x > 0) {
int remainder = x % 10;
x = x / 10;
repeatedDigits[remainder] = repeatedDigits[remainder] + 1;
}
int index = 0;
while (index < 10) {
if (repeatedDigits[index] != 0)
System.out.println("The digit " + index + " occurs " + repeatedDigits[index]);
index++;
}
}
}
这有助于我们查看程序的结构。我们现在可以看到程序运行如下:
int
数组:int[] repeatedDigits = new int[10];
while
循环:while (x > 0) { ... }
int
变量:int index = 0;
while
声明的if
:while (index < 10) { if ( ... ) { ... } }
我将尝试一次一个地解释这四个部分中的每一个。
int
数组。 new int[10]
定义了一个包含十个点的数组,每个数组都可以包含一个整数。您可以将此视为彼此相邻的十个框,每个框都标有索引。该数组将用于跟踪我们看到每个整数的次数。 repeatedDigits[0]
将保持我们在我们的号码中看到0
数字的次数; repeatedDigits[6]
将保持我们看到6
数字的次数,依此类推。int remainder = x % 10;
。 %
被称为modulo
运算符,您可以搜索它以了解更多信息。使用输入992121
,这将把remainder
分配给1
。下一行使用整数除法从数字中删除最后一位数,以便下次循环时我们得到下一位数。如果x = 992121
然后在x = x / 10
之后,x
将等于99212
。
最后,我们在repeatedDigits
数组中添加一个对应于我们看到的数字的点。所以在我们的例子中,remainder = 1
,所以我们将1
添加到repeatedDigits[1]
点。这条线充分利用了未初始化的int
默认为0
的事实。
我们到达了while
循环的末尾,所以我们检查条件,找到x > 0
,所以我们再次运行循环。我们对输入数字中的每个数字重复一次。
现在已经完成了艰苦的工作;程序的其余部分用于打印结果。
index
指定为0.下一个while
循环将此变量从0
增加到9
,为每个数字打印repeatedDigits
数组的值。index = 0
到index = 9
运行循环。对于每个值,我们检查是否在输入数字中看到了该数字(即if
语句)。我们检查repeatedDigits[index]
中的值,看看它是否不等于0
。如果是这样,那么我们必须在前一个循环中增加它,所以我们知道该数字在原始输入中至少出现一次。在这种情况下,我们使用System.out.println
在控制台上打印一行。然后我们增加index
并再次启动循环。如果您有任何问题,请告诉我,祝您好运!