題目描述:通過鍵盤錄入數組,一個整型數組裏除了一個數字外,其他的數字都出現兩次,找出這個數字。
鍵盤錄入:[1,3,4,4,3,1,5]
鍵盤輸出:5
詳細代碼:
public class shuzu {
public static void main(String[] args) {
//fun2();
fun1();
}
//方法二:通過TreeMap集合方法求出
public static void fun2(){
int[] a = tool();
TreeMap<Integer, Integer> hm = new TreeMap<Integer, Integer>();
for(Integer i : a){
if(hm.containsKey(i))
hm.put(i, hm.get(i)+1);
else
hm.put(i, 1);
}
for(Map.Entry<Integer, Integer> ar : hm.entrySet()){
if(ar.getValue()==1)
System.out.println(ar.getKey());
}
}
//方法一:通過異或的運算,找出一個數字
public static void fun1(){
int[] a = tool();
int result = a[0];
for(int j=1;j<a.length;j++){
result = a[j]^result;
}
System.out.println(result);
}
//把輸入的數據存入到數組中
public static int[] tool() {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String line = str.substring(1, str.length()-1);
String[] buf = line.split(",");
int[] a = new int[buf.length];
for(int i=0;i<a.length;i++) {
a[i]=Integer.valueOf(buf[i]);
}
return a;
}
}
一. 通過鍵盤輸入字符串([1,3,4,4,3,1,5]),首先要對輸入的數據格式做處理,需用到String類的substring()方法,把輸入的"[ ]"
去除,該方法參數爲截取部分字符串,中有兩個參數start和end,截取後包含頭,不包含尾,所以start=1,end=str.length-1,
然後字符串變爲"1,3,4,4,3,1,5", 再通過String類的split()方法, 按照","分割存到字符串數組中。再通過Integer類中的valueof()
方法即可將String類型數組轉換爲int類型數組。
二. 方法一:
通過位運算異或(^):
異或運算中,任何一個數字和自己本身異或都是0,任何一個數字和0異或都是本身。
通過該方法即可運用到該題中 ( 除了有兩個數字只出現了一次,其他數字都出現了兩次);所以從頭到尾異或數組中
的每一 個數字,那些出現了兩次的數字全部在異或中被抵消掉。
示例:(1,3,4,4,3,1,5)
1^3=2 2^4=6 6^4=2 2^3=1 1^1=0 0^5=5
異或的本質是通過位運算來計算 ,就是先把十進制的數先換爲二進制,然後通過異或規則即可得到出現一次的數字。
三. 方法二:
利用集合Map
詳細過程:通過遍歷數組存到Map集合中在存入時進行判斷,把數組中的元素存到Map集合中鍵裏,依次判斷存進的數
若集合中不存在,即存入,把值賦爲一;若集合中存在,即把值加一,依次遍歷完,當值爲一的那個元素,即是數組中
只出現一次的數。