我想检查数组中的元素是否根据其出现次数进行排序。这假设它们已经在元素相同的情况下进行了分组。
int [] y = {7, 7, 7, 8, 8, 5, 5, 5, 5}
应该返回false
而int [] y = {5, 5, 5, 5, 7, 7, 7, 8, 8}
应该返回true
。有四个5,三个7和两个8,所以它应该这样安排。
这是我到目前为止所做的:
import java.io.*;
import java.util.*;
public class testing2 {
public static void main(String[] args){
int [] y = {7, 7, 7, 8, 8, 5, 5, 5, 5};
System.out.println(isSorted(y)); // should return false
}
public static boolean isSorted(int[] y){
HashMap<Integer,Integer> hash = new HashMap<Integer,Integer>();
for(int i=0; i<y.length; i++){
if(hash.containsKey(y[i])){
hash.put(y[i], hash.get(y[i]) + 1);
} else {
hash.put(y[i], 1);
}
}
System.out.println(hash);
return true; // code is not complete yet
}
}
它会打印出来:
{5=4, 7=3, 8=2}
true
所以现在我有每个元素的出现次数。我接下来该怎么办?
答案 0 :(得分:1)
你可以在一次数组传递中解决这个问题;这里有一些提示:
在迭代数组时,跟踪当前number
(例如5,7或8)和quantity
。完成下一组number
后,请将其与之前的number
/ quantity
进行比较。然后,适当地返回true或false。
答案 1 :(得分:1)
如果您希望保留使用HashMap
的方向,则有一种方法可以继续:
LinkedHashMap
,因此当您通过地图进行迭代时,您将按照将其放入地图的顺序进行迭代通过地图迭代,看看每个条目是否有<
个上一个条目。伪代码:
int prevCount = MAX_INT;
for (entry : map) {
currentCount = entry.getValue()
if (currentCount > prevCount) {
return false
}
prevCount = currentCount
}
return true;
或者,您可以在阵列上进行一次单次传递(伪代码):
prevCount = MAX_INT
currentCount = 0;
for (i = 0...array.length) {
increment currentCount
// if i points to last number in group
if (i is the last element of array, OR
next element is not equals to current element) {
if currentCount > prevCount {
return false;
}
prevCount = currentCount;
currentCount = 0;
}
}