# day_01: Single Number ###### tags: `online_judge`, `python3` 給定一個非空的整數陣列,其中除了一個特別的元素只會出現一次之外,所有元素皆會出現兩次。問該特別元素的值。 一般來說可以使用 hash table 來解,記錄各個 key (元素)的出現次數。 但同時在偶然在網路上發現了一個 bit-wise 解法。把各個元素轉換成 2 進制並記錄各位數 1 的出現次數。 例如給定```[4,4,1]```, 轉換為 2 進制後即為```[0b0100,0b0100,0b0001]``` 各位數 1 的出現次數為```[0],[2],[0],[1]``` 因為非特別的元素必定出現兩次,所以各位數的出現次數必為 2 的倍數。 因此對各個位數的記錄取 2 的餘數,即可去除所有非特別元素的記錄。 ```[0 % 2],[2 % 2],[0 % 2],[1 % 2]``` -> ```[0],[0],[0],[1]``` 將該筆二進制資料恢復為十進制即為解答。 ```[0],[0],[0],[1]``` -> ```[0b0001]``` -> ```[1]``` --- ## 題目 ``` Given a non-empty array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? Example 1: Input: [2,2,1] Output: 1 Example 2: Input: [4,1,2,1,2] Output: 4 ``` --- ## 解答 python hash table version: ```python= class Solution: def singleNumber(self, nums): table = {} for i in range(len(nums)): if not table.__contains__(nums[i]): table[nums[i]] = 1; else: table.pop(nums[i]) return list(table)[0] a = Solution() print("%s" % a.singleNumber([2,2,1])) print("%s" % a.singleNumber([4,1,2,1,2])) print("%s" % a.singleNumber([4,1,2,1,2])) ``` C bitwise version: ```c= #include <stdio.h> #include <stdlib.h> #include <string.h> int singleNumber(int* nums, int numsSize){ int i, j; unsigned int bit_map[32] = {0}; for (i=0;i<numsSize;i++){ for (j=0;j<32;j++){ bit_map[j] += (nums[i] >> j & 1); } } int ans=0; for (j=0;j<32;j++){ ans += (bit_map[j] % 2 << j); } return ans; } int main(){ int num0[] = {2,2,1}; printf("%d\n",singleNumber(num0,3)); int num1[] = {4,1,2,1,2}; printf("%d\n",singleNumber(num1,5)); int num2[] = {-1}; printf("%d\n",singleNumber(num2,1)); } ``` --- ### 成績 ![](https://i.imgur.com/nGfRpAr.png) ![](https://i.imgur.com/wZnFigd.png) ---