我正在尝试计算数组中整数的出现次数。我能够通过拼凑我在网上发现的一些代码来实现它,但我真的不明白为什么它的工作。我所拥有的是:
int[] hand = {2, 4, 3, 2, 4};
int[] numOccurence = new int[hand.length];
for (int i = 0; i < hand.length; i++)
numOccurence[hand[i]]++;
for (int i = 1; i < numOccurence.length; i++)
if (numOccurence[i] > 0)
System.out.println("The number " + i + " occurs " + numOccurence[i] + " times.");
输出是: 数字2出现2次。 数字3出现1次。 数字4出现2次。
这段代码如何正确计算出现次数?我不知道它是如何实现这一目标的。提前谢谢!
答案 0 :(得分:3)
这只是因为祝你好运。尝试将手数组中的第二个元素设为5
,看看会发生什么。这是因为当前索引hand
处出现的数字被视为数组numOccurence
的索引。如果数字大于或等于numOccurence
的长度,您将获得ArrayIndexOutOfBoundsException
。
因此,您可以更好地使用Map
,其中密钥是数字,值可能是其数量。
这样的事情: -
Map<Integer, Integer> numOccurence = new HashMap<Integer, Integer>();
for (int i = 0; i < hand.length; i++) {
int cnt = 1;
if (numOccurence.containsKey(hand[i])) {
cnt = numOccurence.get(hand[i]);
cnt++;
}
numOccurence.put(hand[i], cnt);
}
答案 1 :(得分:3)
此代码不起作用。至少它适用于作者的用例,但可能不属于你的用例。
尝试将{2, 4, 99, 2, 4};
作为hand
,然后失败。
作者将hand
中的数字作为数组numOccurence
的索引。
numOccurence
具有以下结构:{nb occ 0 ; nb occs of 1 ; ...; nb的 4 }。这里99将超出范围。
答案 2 :(得分:1)
创建数组时
int[] numOccurence = new int[hand.length];
它由默认值填充。对于原始int,此值为0.
这当然只有在手包含小于或等于数组的最大索引(长度-1)的数字时才有效,否则它就是你的阵列的ArrayIndexOutOfBound!
答案 3 :(得分:0)
实际上它与为图片创建直方图的方法相同;)
您可以创建一个表格来收集事件。 numOccurence [0]将存储0的数字 numOccurence [1]将库存数量为1 等
这是由
完成的for (int i = 0; i < hand.length; i++)
numOccurence[hand[i]]++;
它对应于数字hand [i]
的情况下的值加1所以如果你一步一步看 首先他将采取手[0] = 2 所以他会把
numOccurence[2] = numOccurence[2] + 1 ;
与
相同(但写入速度更快)numOccurence[2]++;
答案 4 :(得分:0)
这种执行计数称为counting sort。
计算排序的好处是它的速度。缺点是对大数字进行排序时的内存要求。
代码中存在错误:
int[] numOccurence = new int[hand.length];
numOccurence
需要与列表中的最大数字一样长(而不是列表中的数字)。尝试将其中一个数字更改为15
,您将获得例外。
答案 5 :(得分:0)
首先,代码是错误的。您应该将numOccurence
数组的大小设置为hand
数组+ 1的最大数值。例如:
int[] hand = {2, 100};
int[] numOccurence[] = new int[101];
(显然你应该以编程方式找到最大数字)
现在让我们来看看算法。
它从hand
数组中获取每个数字,将其视为numOccurence
索引值,并在hand
数组中将该索引处的数字增加1。请注意,默认情况下,numOccurence
数组的所有元素都是0
。
int[] hand = {2, 4, 3, 2, 4};
int[] numOccurence = new int[5];
步骤:
i = 0
(没有任何反应,因为hand
数组中没有0)
i = 1
(与0相同的情况)
i = 2
(2
数组中有两个hand
个数字,因此我们执行两次numOccurence[2] += 1
次操作,结果为0 + 1 + 1 = 2。我们得到numOccurence[2] = 2
)
从0
到hand
数组的最大数字(此处为100
),所有数字都会继续。
答案 6 :(得分:0)
代码遍历给定的数组hand
。它将每个遇到的值作为数组numOccurrence
的索引。对于n
中的每个数字hand
,这种情况与n
中出现hand
的情况完全相同,每次发生这种情况时,都会n
numOccurrence
将会增加。
因此numOccurrence
实际上是一个计数器数组(假设数组元素用0
初始化)。
hand
数组中的数字大小。hand
数组中的数字稀疏地分布,则大多数分配的空间永远不会被使用。您可以先排序hands
来改进代码。在排序数组中,给定数字的所有出现的索引都是连续的,因此只需要一个计数器就可以扫描已排序的数组,以便编译频率。