Given a non-empty array of integers nums, every element appears twice except for one. Find that single one.
You must implement a solution with a linear runtime complexity and use only constant extra space.
給予一個非空白的整數陣列 nums,每一個元素皆出現兩次只有一個沒有。 尋找出現一次的元素。 你必須實現具有線性運行複雜度的解決方案,不能使用額外的空間。
Example 1:
Input: nums = [2,2,1] Output: 1
Example 2:
Input: nums = [4,1,2,1,2] Output: 4
Example 3:
Input: nums = [1] Output: 1
Solution:
1. 如果 nums 中只有一個數值,則返回該數值。
2. 宣告一個 box 物件 {}。
3. 將 nums 中的數值與次數依序放入 box 物件中。
4. 依序尋找物件中數值的次數為 1,回傳該數值。
Code 1: two for loop
var singleNumber = function(nums) { if (nums.length ===1) return nums[0] let box = {} for (let i = 0; i < nums.length; i++) { if (box[nums[i]]) { box[nums[i]]++ } else { box[nums[i]] = 1 } } for (let num in box) { if (box[num] === 1) { return num; } } };
FlowChart:
Example 1
Input: nums = [2,2,1] nums.length = 3 box = {} step.1 box = {'2': 1} box = {'2': 2} box = {'1': 1, '2': 1} step.2 box = {'1': 1} = 1, return i //1
Example 2
Input: nums = [4,1,2,1,2] nums.lenght = 5 box = {} step.1 box = {'4': 1} box = {'1': 1, '4': 1} box = {'1': 1, '2': 1, '4': 1} box = {'1': 2, '2': 1, '4': 1} box = {'1': 2, '2': 2, '4': 1} step.2 box = {'1': 2} <> 1 box = {'2': 2} <> 1 box = {'4': 1} = 1, return i //1
Example 3
Input: nums = [1] nums.length = 1, return nums[0] //1
Code 2: two for loop
var singleNumber = function(nums) { if (nums.length === 1) return nums[0] let box = {} for (let i = 0; i < nums.length; i++) { box[nums[i]] = (box[nums[i]] || 0) + 1 } for (let num in box) { if (box[num] === 1) return num; } };
Code 3: XOR
var singleNumber = function(nums) { for (let i = 1; i < nums.length; i++) { nums[0] ^= nums[i] } return nums[0]; };
^= 運算符號
^= : 使用二進制進行結果分配。(1 + 1 = 0, 1 + 0 = 1, 0 + 1 = 1) 8421 let a = 5; // 00000000000000000000000000000101 a ^= 3; // 00000000000000000000000000000011 console.log(a); // 00000000000000000000000000000110 // expected output: 6 Input: nums = [2,2,1] Binary: [0000] 8421 0010 //nums[0] = 2 0010 //nums[1] = 2 ----------------- 0000 // 0 0000 //nums[0] = 0 0001 //nums[1] = 1 ----------------- 0001 // 1 0001 //nums[0] = 1