在Java中循环计算数组中整数的出现次数
注意:无映射,无排序
这是我的密码:
public static void countArray(int[] n){
int[] m = new int[n.length]; //50 elements of integers between values of 10 & 20
int count = 0;
int sum = 0;
for ( int i = 0; i < n.length ; i++){
m[i] = n[i]; //make a copy of array 'n'
System.out.print(m[i]+" ");
}System.out.println();
for ( int j =0; j < n.length ; j++){
count =0;
for(int i = 0; i < n.length ; i++){
if (n[j]%m[i]==0 && n[j] == m[i])
count++;
}if ( n[j]%m[j] == 0)
System.out.println(m[j] + " occurs = " + count);
}
}
所以问题是:我在不同的行上得到重复的结果,比如:“25发生=5”
我的想法:问题的出现是因为if ( n[j]%m[j] == 0)
所以我试了一下。另一个问题发生了,因为m[j]
将是m[50]
,所以它崩溃了,但某种程度上给了我想要的结果
我想要的结果是:类似这样:不重复,覆盖集合上的所有随机整数
17 occurs = 3
23 occurs = 2
19 occurs = 3
15 occurs = 2
12 occurs = 2
# 1 楼答案
这里有一个很好的、有效的方法,比这里发布的其他解决方案更有效。这一个在O(n)时间内运行,其中数组的长度为n。它假设您有一些数字
MAX_VAL
,表示在数组中可能找到的最大值,最小值为0。在你的评论中,你建议MAX_VAL==20
它首先在数组中循环,每次找到元素时增加相关计数器。然后它返回,并打印出每一个的计数。但是,至关重要的是,每次打印一个整数的计数时,它都会将该整数的计数重置为0,这样就不会再次打印
如果您不喜欢
for (int i: arr)
样式,那么这是完全等效的:# 2 楼答案
如果利用输入限制,则可能会丢失嵌套循环:
# 3 楼答案
通过一些调整,您的代码应该可以工作:
你完全可以用同样的逻辑来编写更好的代码,我只是试着遵循最初的“编码风格”
这是O(n^2)解决方案(请阅读“非常慢”)
如果您可以使用排序,那么您可以在O(n log(n))中进行排序-即快速
有了映射,你可以在O(n)中完成它,这是非常快的
# 4 楼答案
尝试:(对数组排序,然后计算元素的出现次数)