題目描述:
給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 1:
輸入: [2,2,1]
輸出: 1
示例 2:
輸入: [4,1,2,1,2]
輸出: 4
方法一(^異或運算符)
異或運算符在兩個相等運算符之間運算結果爲0,例如4^4=0,4^0=4.
根據異或運算符的提點,所有出現兩次的數字最後的運算結構都爲0,只有出現一次的數字與0運算結果是本身。
代碼如下:
public static int singleNumber(int[] nums) {
int num = 0;
for (int i = 0; i < nums.length; i++) {
num = num ^ nums[i];
}
return num;
}
方法二(藉助HashSet)
思路:將元素添加到HashSet,在添加之前判斷集合中是否已有該元素,如果有則移除,否則添加。
代碼如下:
public static int singleNumber(int[] nums) {
HashSet set = new HashSet<Integer>();
for(int i = 0; i < nums.length; i++){
if(set.contains(nums[i])) {
set.remove(nums[i]);
}else {
set.add(nums[i]);
}
}
int tmp = 0;
Iterator<Integer> it = set.iterator();
while(it.hasNext()) {
System.out.println(tmp=it.next());
}
return tmp;
}
方法三(藉助排序)
思路:先將元素排序,這時數組中相等的元素兩兩相鄰,進行判斷即可。
public static int singleNumber(int[] nums) {
Arrays.sort(nums);
for(int i = 0; i < nums.length - 1; i+=2) {
if(nums[i] != nums[i+1]) {
return nums[i];
}
}
return nums[nums.length - 1];
}
方法四(暴力法)
思路:按照數組中的順序遍歷元素,進行比較,沒有與選定元素相等的元素則返回。
public static int singleNumber(int[] nums) {
if(nums.length > 1) {
for(int i = 0; i < nums.length-1; i++) {
boolean b = false;
for(int j = 0; j < nums.length; j ++) {
if(i == j) continue;
if(nums[i] == nums[j]) {
b = true;
}
}
if(b == false) return nums[i];
}
}
return nums[nums.length-1];
}