zoukankan      html  css  js  c++  java
  • [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 }
  • 相关阅读:
    2019暑假集训 windy数
    2019暑假集训 数字游戏
    2019暑假集训 周年纪念晚会
    2019暑假集训 加分二叉树
    0013-求圆柱体体积
    0012-求滑动距离
    0011-绝对值函数
    0010-温度转换
    0009-乘法问题
    0008-三位数倒序问题
  • 原文地址:https://www.cnblogs.com/strengthen/p/9963667.html
Copyright © 2011-2022 走看看