隻出現一次的數字
-
- 題目
- 大緻思路
- 代碼實作
題目
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLxsmeNRTSE9kMNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0gjN0ITO1AjMxEDOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
大緻思路
方法一:先排序,然後2個2個進行周遊,因為排序之後這個單獨的數字一定在偶數下标對應的位置,找到不相同的這兩個相鄰數字,這兩個數字中位于偶數下标的即為那個單獨的數字,如果周遊結束還沒找到,則為最後一個數字,注意周遊的時候隻周遊到長度-1處即可。
方法二:利用set集的特性,來進行實作,出現重複的就删除出set,對對碰的思想,直到周遊完,set中剩餘的那一個就是單獨的那個數字。
方法三:內插補點法,排序後,單獨的那個數字一定在偶數下标處,将所有偶數下标數字加起來減去所有奇數下标數字的和即為所求值。
方法四:異或法,該題的最佳解法:同的數字異或為0,0與任何數字異或,結果為該數字,即為那個但難度的數字
代碼實作
class Solution {
public int singleNumber(int[] nums) {
/*周遊法,先排序,再周遊 10ms
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];
*/
/* 方法二:利用set集的特性,來進行實作,出現重複的就删除出set,對對碰的思想,直到周遊完,set中剩餘的那一個就是 單獨的那個數字 20ms
Set<Integer> set = new HashSet<>();
for(int i = 0;i<nums.length;i++){
if(!set.add(nums[i])){
set.remove(nums[i]);
}
}
return set.iterator().next();
*/
/*方法三:內插補點法:排序後,單獨的那個數字一定在偶數下标處,将所有偶數下标數字加起來減去所有奇數下标數字的和,
//即為所求的值。 10ms
Arrays.sort(nums);
int count = 0;
for(int i = 0;i<nums.length;i++){
count = i % 2 == 0 ? count+nums[i] : count-nums[i];
}
return count;
*/
//*方法四:異或法,相同的數字異或為0,0與任何數字異或,結果為該數字,1ms,異或法應該為最佳解法。
int result = 0;
for(int i = 0;i<nums.length;i++){
result = result ^ nums[i];
}
return result;
}
}