[Swift]LeetCode137. 只出现一次的数字 II | Single Number II
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9963667.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Given a non-empty array of integers, every element appears three times except for one, which appears exactly once. 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,3,2] Output: 3
Example 2:
Input: [0,1,0,1,0,1,99] Output: 99
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,3,2] 输出: 3
示例 2:
输入: [0,1,0,1,0,1,99] 输出: 99
12ms
1 class Solution { 2 func singleNumber(_ nums: [Int]) -> Int { 3 let count = nums.count 4 guard count > 0 else { return 0 } 5 let range = 1..<count 6 var oneTime = nums[0] 7 var twoTimes = 0 8 var notThreeTimes = 0 9 for i in range { 10 let next = nums[i] 11 twoTimes |= oneTime & next 12 oneTime ^= next 13 notThreeTimes = ~(oneTime & twoTimes) 14 oneTime &= notThreeTimes 15 twoTimes &= notThreeTimes 16 } 17 return oneTime 18 } 19 }
16ms
1 class Solution { 2 func singleNumber(_ nums: [Int]) -> Int { 3 var a = 0, b = 0; 4 for num in nums { 5 b = (b ^ num) & ~a; 6 a = (a ^ num) & ~b; 7 } 8 return b; 9 } 10 }
24ms
1 class Solution { 2 func singleNumber(_ nums: [Int]) -> Int { 3 guard nums.count > 0 else { 4 return 0 5 } 6 7 var temp = [Int: Int]() 8 9 for num in nums { 10 temp[num] = temp[num, default: 0] + 1 11 } 12 13 for key in temp.keys { 14 if temp[key]! == 1 { 15 return key 16 } 17 } 18 19 return 0 20 } 21 }
28ms
1 class Solution { 2 func singleNumber(_ nums: [Int]) -> Int { 3 var resSet = Set<Int>(nums) 4 var showed = Set<Int>() 5 for num in nums { 6 if showed.contains(num) { 7 resSet.remove(num) 8 } 9 showed.insert(num) 10 } 11 return resSet.first! 12 } 13 }
76ms
1 class Solution { 2 func singleNumber(_ nums: [Int]) -> Int { 3 var numDict = [Int: Int]() 4 for num in nums { 5 if let value = numDict[num] { 6 numDict[num] = value + 1 7 } else { 8 numDict[num] = 1 9 } 10 } 11 12 let singleVal = numDict.filter { $0.value == 1 }.first! 13 return singleVal.key 14 } 15 }
80ms
1 class Solution { 2 func singleNumber(_ nums: [Int]) -> Int { 3 return ((Set(nums).reduce(0,+) * 3) - nums.reduce(0,+))/2 4 } 5 }
80ms
1 class Solution { 2 func singleNumber(_ nums: [Int]) -> Int { 3 guard nums.count > 0 else { 4 return 0 5 } 6 var result = 0 7 for i in 0..<MemoryLayout<Int>.size * 8 { 8 var count = 0 9 for j in 0..<nums.count { 10 count += (nums[j] >> i) & 1 11 } 12 13 result += (count % 3) << i 14 } 15 16 return result 17 } 18 }