2595. 奇偶位数
题目描述
给你一个 正 整数 n
。
用 even
表示在 n
的二进制形式(下标从 0 开始)中值为 1
的偶数下标的个数。
用 odd
表示在 n
的二进制形式(下标从 0 开始)中值为 1
的奇数下标的个数。
请注意,在数字的二进制表示中,位下标的顺序 从右到左。
返回整数数组 answer
,其中 answer = [even, odd]
。
示例 1:
输入:n = 50
输出:[1,2]
解释:
50 的二进制表示是 110010
。
在下标 1,4,5 对应的值为 1。
示例 2:
输入:n = 2
输出:[0,1]
解释:
2 的二进制表示是 10
。
只有下标 1 对应的值为 1。
提示:
1 <= n <= 1000
解法
方法一:枚举
我们根据题意,枚举 \(n\) 的二进制表示中从低位到高位的每一位,如果该位为 \(1\),则根据该位的下标是奇数还是偶数,将对应的计数器加 \(1\) 即可。
时间复杂度 \(O(\log n)\),空间复杂度 \(O(1)\)。其中 \(n\) 为给定的整数。
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 9 10 |
|
1 2 3 4 5 6 7 |
|
1 2 3 4 5 6 7 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
方法二:位运算
我们可以定义一个掩码 \(\textit{mask} = \text{0x5555}\),它的二进制表示为 \(\text{0101 0101 0101 0101}_2\)。那么 \(n\) 与 \(\textit{mask}\) 进行按位与运算,就可以得到 \(n\) 的二进制表示中偶数下标的位,而 \(n\) 与 \(\textit{mask}\) 取反后再进行按位与运算,就可以得到 \(n\) 的二进制表示中奇数下标的位。统计这两个结果中 \(1\) 的个数即可。
时间复杂度 \(O(1)\),空间复杂度 \(O(1)\)。其中 \(n\) 为给定的整数。
1 2 3 4 5 6 |
|
1 2 3 4 5 6 7 8 |
|
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 |
|