# Apex Coding Challenge Find Highest Frequency of Numbers

Problem: Find the number that has the highest frequency in a list of integers.

Input: 1,6,2,1,6,1

Output: 1 //because 1 occurs 3 times in the list

Option 1: Use Hashmap to iterate list

```	List<Integer> nums = new List<Integer>{1,6,2,1,6,1};
Map<Integer, Integer> numMap = new HashMap<>();
for (Integer num : nums){
if (numMap.containsKey(num)){
Integer numFreq = numMap.get(num);
numMap.put(num, numFreq+1);
} else {
numMap.put(num, 1);
}
}

Integer biggestFreq = 0;
Integer biggestVal = 0;
for (Integer num : numMap.keySet()){
if (numMap.get(num) > biggestFreq){
biggestFreq = numMap.get(num);
biggestVal = num;
}
}

System.debug(biggestVal);
```

Option 2: Use wrapper class with compare to sort wrapper

```List<Integer> nums = new List<Integer>{1,6,2,1,6,1};

Map<Integer, NumFrequencyWrapper> numMap = new HashMap<>();
for (Integer num : nums){
if (numMap.containsKey(num)){
NumFrequencyWrapper numFreqWrapper = numMap.get(num);
numFreqWrapper.setFrequency(numFreqWrapper.getFrequency()+1);
numMap.put(num, numFreqWrapper);
} else {
NumFrequencyWrapper numFrequencyWrapper = new NumFrequencyWrapper();
numFrequencyWrapper.setNum(num);
numFrequencyWrapper.setFrequency(1);
numMap.put(num, numFrequencyWrapper);
}
}

List<NumFrequencyWrapper> frequencyWrapperList = new List(numMap.values());
Collections.sort(frequencyWrapperList, new Untitled.NumFrequencyWrapperCompare());
System.debug(frequencyWrapperList.get(0).getNum());

public class NumFrequencyWrapper {
private Integer num;
private Integer frequency;

public void setNum(Integer num){
this.num = num;
}

public Integer getNum(){
return num;
}

public void setFrequency(Integer frequency){
this.frequency = frequency;
}

public Integer getFrequency(){
return this.frequency;
}
}

public class NumFrequencyWrapperCompare implements Comparator<NumFrequencyWrapper>{
public int compare(NumFrequencyWrapper a, NumFrequencyWrapper b) {
return  b.getFrequency() - a.getFrequency();
}
}
```

Option 3: Using buckets to group index of frequencies together

```List<Integer> nums = new List<Integer>{1,6,2,1,6,1};
Integer returnNums = 2;
Map<Integer, Integer> numMap = new Map<Integer, Integer>();
for (Integer num : nums){
if (numMap.containsKey(num)){
Integer numFreq = numMap.get(num);
numMap.put(num, numFreq+1);
} else {
numMap.put(num, 1);
}
}

Map<Integer, List<Integer>> mapOfBucketWithValues = new Map<Integer, List<Integer>>();
for (Integer num : numMap.keySet()){
Integer numFrequency = numMap.get(num);
if (mapOfBucketWithValues.containsKey(numFrequency)){
List<Integer> existingIndexNum = mapOfBucketWithValues.get(numFrequency);
mapOfBucketWithValues.put(numFrequency, existingIndexNum);
} else {
List<Integer> numList = new ArrayList<>();
mapOfBucketWithValues.put(numFrequency, numList);
}
}

for (Integer k=nums.size(), returnedNums=0; 1<=k; k--){
if (mapOfBucketWithValues.containsKey(k)){
for (Integer numBucket : mapOfBucketWithValues.get(k)){
if (returnedNums < returnNums){
System.debug(numBucket);
returnedNums++;
}
}
}
}
```