【题目描述】
每个非负整数 N 都有其二进制表示。例如, 5 可以被表示为二进制 "101",11 可以用二进制 "1011" 表示,依此类推。注意,除 N = 0 外,任何二进制表示中都不含前导零。
二进制的反码表示是将每个 1 改为 0 且每个 0 变为 1。例如,二进制数 "101" 的二进制反码为 "010"。
给定十进制数 N,返回其二进制表示的反码所对应的十进制整数。
【示例1】
输入:5
输出:2
解释:5 的二进制表示为 "101",其二进制反码为 "010",也就是十进制中的 2 。
【示例2】
输入:7
输出:0
解释:7 的二进制表示为 "111",其二进制反码为 "000",也就是十进制中的 0 。
【示例3】
输入:10
输出:5
解释:10 的二进制表示为 "1010",其二进制反码为 "0101",也就是十进制中的 5 。
【提示】
1、0 <= N < 10^9
【思路1】
1、直接翻译
2、时间复杂度O(n)
3、空间复杂度O(n)
Swift代码实现:
func bitwiseComplement(_ N: Int) -> Int {
if N == 0 { return 1 }
var binaryArr = [Int]()
var tmpN = N
while tmpN > 0 {
binaryArr.append(tmpN%2)
tmpN/=2
}
var k = binaryArr.count-1
while binaryArr[k] == 0 {
binaryArr.remove(at: k)
k-=1
}
for i in 0..<binaryArr.count {
binaryArr[i] = binaryArr[i] == 1 ? 0 : 1
}
var res = 0.0
for (i,v) in binaryArr.reversed().enumerated() {
res+=(Double(v)*pow(Double(2), Double(binaryArr.count-1-i)))
}
return Int(res)
}
改进版:
func bitwiseComplement(_ N: Int) -> Int {
if N == 0 { return 1 }
var tmpN = N
var k = 0
var res = 0.0
while tmpN > 0 {
var tmp = tmpN%2
tmp = tmp == 1 ? 0 : 1
res+=(Double(tmp)*pow(Double(2), Double(k)))
k+=1
tmpN/=2
}
return Int(res)
}