我的LeetCode:https://leetcode cn.com/u/ituring/ 我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 136. 只出現一次的數字 題目 給定一個非空整數數組,除了某 ...
我的LeetCode:https://leetcode-cn.com/u/ituring/
我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii
LeetCode 136. 只出現一次的數字
題目
給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 1:
輸入: [2,2,1]
輸出: 1
示例 2:
輸入: [4,1,2,1,2]
輸出: 4
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/single-number
著作權歸領扣網路所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
解題思路
思路1-利用異或運算解決
利用位運算中異或運算的特性:
- bit位不同異或結果為1,否則為0;
- 任意數與本身異或為0;
- 任意數與0異或為其本身;
一個例子,不使用額外變數,利用異或運算交換兩個值:
public static void swap(int x, int y) {
System.out.println("x=" + x);
System.out.println("y=" + y);
// 任意數與本身異或為0
int z = (x ^ x);
System.out.println(z == 0);
// 使用異或特性交換兩個值
x = x ^ y;
y = x ^ y;
x = x ^ y;
System.out.println("x=" + x);
System.out.println("y=" + y);
}
演算法複雜度:
- 時間複雜度: $ {\color{Magenta}{\Omicron\left(n\right)}} $
- 空間複雜度: $ {\color{Magenta}{\Omicron\left(1\right)}} $
演算法源碼示例
package leetcode;
/**
* @author ZhouJie
* @date 2020年5月14日 下午9:55:37
* @Description: 136. 只出現一次的數字
*
*/
public class LeetCode_0136 {
}
class Solution_0136 {
/**
* @author: ZhouJie
* @date: 2020年5月14日 下午9:56:09
* @param: @param nums
* @param: @return
* @return: int
* @Description: 1-直接異或所有數,剩下的即為唯一數;
*
*/
public int singleNumber(int[] nums) {
int number = 0;
for (int val : nums) {
number ^= val;
}
return number;
}
}