用map存儲,key爲數組中的元素,value爲元素出現的次數,若數組中的元素都只出現了一次,則map.put(num[i],1),否則,每當檢測到map中的key已經包含有數組元素時,將map中與之的value值加1,表示次數+1,最後再在map中找出value最大key,輸出。
package array;
import java.util.*;
/*
* 找出數組中出現次數最多的數字
* 思路:用一個HashMap記錄每個數字出現的次數
*/
public class MostFrequentInArray {
public static void main(String[] args){
int [] num={1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,34,4,4,4,4,5,5,6,67,7,7,89};
System.out.print(getMostFrequent(num));//print 3
}
private static int getMostFrequent(int[] num) {
int count=1;//數字出現的次數
Map<Integer,Integer> m=new HashMap<>();
for (int i=0;i<num.length;i++){
if(m.containsKey(num[i])){
m.put(num[i],m.get(num[i])+1);
}else{
m.put(num[i],count);
}
}
int result=0;
int most=0;//找出map中出現次數最多的元素
Iterator iter=m.entrySet().iterator();
while(iter.hasNext()){
Map.Entry entry =(Map.Entry)iter.next();
int key=(Integer)entry.getKey();
int val=(Integer)entry.getValue();
if(val>most){
result=key;
most=val;
}
}
return result;
}
}
對於找出數組中只出現了一次的數字來說,可以利用異或這個巧妙的辦法,由於任何一個數字和自己本身異或都等於0,所以從頭到尾一次異或數組中的每一個元素,那麼出現兩次的數字就會被全部抵消掉,最終的結果也就是所要求的只出現一次的那個數字啦。代碼很簡單 look
package array;
/*
* 找出數組中只出現了一次的數字,
* 題目:一個整型數組中,除了一個數字,其他數字都出現了兩次,找出這個數字,要求時間複雜度爲O(n).空間複雜度爲O(1)
* 思路:異或運算,相同爲0 不同爲1
*/
public class FindNotDouble {
public static void main (String [] args){
int [] num={1,1,2,2,3,3,5,6,6};
System.out.print(findnotdouble(num));
}
private static int findnotdouble(int[] num) {
int result=num[0];
for (int i=1;i<num.length;++i)
result=result^num[i];
return result;
}
}