//https://leetcode-cn.com/problems/single-number/solution/swift-wei-yun-suan-by-hu-cheng-he-da-bai-sha///执行用时:88 ms, 在所有 Swift 提交中击败了99.50%的用户//内存消耗:20.7 MB, 在所有 Swift 提交中击败了100.00%的用户/* 异或运算有以下三个性质: 任何数和 0 做异或运算,结果仍然是原来的数,即 a^0=a。 任何数和其自身做异或运算,结果是 0,即 a^a=0。 异或运算满足交换律和结合律,即 a^b^a=b^a^a=b^(a^a)=b^0=b。 */funcsingleNumber(_nums: [Int]) ->Int {var res =0for i in nums { res ^= i }return res}
//https://leetcode-cn.com/problems/single-number-ii/solution/swift-wei-yun-suan-by-hu-cheng-he-da-bai-sha-2///思路:https://leetcode-cn.com/problems/single-number-ii/solution/single-number-ii-mo-ni-san-jin-zhi-fa-by-jin407891///执行用时:60 ms, 在所有 Swift 提交中击败了94.29%的用户//内存消耗:21.1 MB, 在所有 Swift 提交中击败了100.00%的用户funcsingleNumber_1(_nums: [Int]) ->Int {var once =0 ,twice =0for i in nums { once = (i ^ once) &~twice twice = (i ^ twice) &~once }return once}
在二进制表示中,数字 n 中最低位的 1总是对应 n - 1中的 0 。因此,将 n 和 n - 1与运算总是能把 n中最低位的 1 变成 0 ,并保持其他位不变。
//https://leetcode-cn.com/problems/number-of-1-bits/solution/swift-zai-er-jin-zhi-biao-shi-zhong-shu-zi-n-zhong///执行用时:8 ms, 在所有 Swift 提交中击败了75.00%的用户//内存消耗:20 MB, 在所有 Swift 提交中击败了100.00%的用户funchammingWeight(_n: Int) ->Int {var res =0var i = nwhile i !=0 { i &= (i -1) res +=1 }return res}
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
//https://leetcode-cn.com/problems/counting-bits/solution/swift-bian-li-mei-ge-shu-an-191-wei-1de-ge-shu-qiu///遍历每个数,按《191. 位1的个数》求出每个数的1的个数(在二进制表示中,数字 n 中最低位的 1总是对应 n - 1中的 0 。因此,将 n 和 n - 1与运算总是能把 n中最低位的 1 变成 0 ,并保持其他位不变。)//执行用时:80 ms, 在所有 Swift 提交中击败了92.31%的用户//内存消耗:24.6 MB, 在所有 Swift 提交中击败了100.00%的用户funccountBits(_num: Int) -> [Int] {funchammingWeight(_n: Int) ->Int {var res =0var i = nwhile i !=0 { i &= (i -1) res +=1 }return res }var res = [Int]()for i in0...num { res.append(hammingWeight(i)) }return res}
另外一种动态规划解法
//https://leetcode-cn.com/problems/counting-bits/solution/swift-dong-tai-gui-hua-ibi-ii-1duo-yi-ge-1zai-zui-//*依据:在二进制表示中,数字 n 中最低位的 1总是对应 n - 1中的 0 。因此,将 n 和 n - 1与运算总是能把 n中最低位的 1 变成 0 ,并保持其他位不变。所以:用i比i&(i-1)多一个1(在最低有效位)来动态规划 */// ms, 在所有 Swift 提交中击败了96.15%的用户//内存消耗:24.6 MB, 在所有 Swift 提交中击败了100.00%的用户funccountBits_a(_num: Int) -> [Int] {if num ==0{return[0] }var res =Array(repeating:0, count: num+1)for i in1...num { res[i]= res[i&(i-1)]+1 }return res}
//https://leetcode-cn.com/problems/reverse-bits/solution/swift-yi-ci-dian-dao-er-jin-zhi-wei-by-hu-cheng-he///依次颠倒二进制位//执行用时:16 ms, 在所有 Swift 提交中击败了64.29%的用户//内存消耗:20.7 MB, 在所有 Swift 提交中击败了100.00%的用户funcreverseBits(_n: Int) ->Int {var num = nvar res =0var pow =31while num !=0 {let bit = num&1 res += bit << pow num = num >>1 pow -=1 }return res}