//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。
*/
func singleNumber(_ nums: [Int]) -> Int {
var res = 0
for 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%的用户
func singleNumber_1(_ nums: [Int]) -> Int {
var once = 0 ,twice = 0
for 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%的用户
func hammingWeight(_ n: Int) -> Int {
var res = 0
var i = n
while 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%的用户
func countBits(_ num: Int) -> [Int] {
func hammingWeight(_ n: Int) -> Int {
var res = 0
var i = n
while i != 0 {
i &= (i - 1)
res += 1
}
return res
}
var res = [Int]()
for i in 0...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%的用户
func countBits_a(_ num: Int) -> [Int] {
if num == 0{
return [0]
}
var res = Array(repeating: 0, count: num+1)
for i in 1...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%的用户
func reverseBits(_ n: Int) -> Int {
var num = n
var res = 0
var pow = 31
while num != 0 {
let bit = num&1
res += bit << pow
num = num >> 1
pow -= 1
}
return res
}