力扣LeetCode:2595 奇偶位数
题目:
给你一个 正 整数 n
。
用 even
表示在 n
的二进制形式(下标从 0 开始)中值为 1
的偶数下标的个数。
用 odd
表示在 n
的二进制形式(下标从 0 开始)中值为 1
的奇数下标的个数。
返回整数数组 answer
,其中 answer = [even, odd]
。
示例 1:
输入:n = 17 输出:[2,0] 解释:17 的二进制形式是 10001 。 下标 0 和 下标 4 对应的值为 1 。 共有 2 个偶数下标,0 个奇数下标。
示例 2:
输入:n = 2 输出:[0,1] 解释:2 的二进制形式是 10 。 下标 1 对应的值为 1 。 共有 0 个偶数下标,1 个奇数下标。
提示:
1 <= n <= 1000
解法:遍历:
代码功能
-
输入:一个整数
n
。 -
输出:一个长度为 2 的
vector<int>
,其中:-
第一个元素表示
n
的二进制表示中偶数位(从 0 开始计数)上值为1
的个数。 -
第二个元素表示
n
的二进制表示中奇数位上值为1
的个数。
-
代码逐行解释
class Solution {
public:
vector<int> evenOddBit(int n) {
vector<int> ans; // 用于存储 n 的二进制表示
if(n == 0) // 特殊情况:如果 n 为 0,直接返回 {0, 0}
{
ans.push_back(0);
}
while(n > 0) // 将 n 转换为二进制,存储在 ans 中
{
ans.push_back(n % 2); // 取余数,得到当前最低位
n /= 2; // 右移一位
}
// reverse(ans.begin(), ans.end()); // 这里注释掉了反转操作
int num1 = 0; // 统计偶数位上 1 的个数
int num2 = 0; // 统计奇数位上 1 的个数
for(int i = 0; i < ans.size(); i++) // 遍历二进制位
{
cout << ans[i] << " "; // 打印当前二进制位(调试用)
if(ans[i] == 1) // 如果当前位是 1
{
if(i % 2 == 0) // 如果是偶数位
{
num1++; // 偶数位计数器加 1
}
else // 如果是奇数位
{
num2++; // 奇数位计数器加 1
}
}
}
vector<int> num; // 用于存储最终结果
num.push_back(num1); // 将偶数位的 1 的个数存入结果
num.push_back(num2); // 将奇数位的 1 的个数存入结果
return num; // 返回结果
}
};
关键点说明
-
二进制转换:
-
通过
while(n > 0)
循环,将n
转换为二进制,存储在ans
中。 -
注意:
ans
中存储的二进制是逆序的(最低位在前)。
-
-
偶数位和奇数位的定义:
-
代码中,偶数位和奇数位是根据
i
的值来判断的:-
i % 2 == 0
:偶数位(例如,i = 0, 2, 4, ...
)。 -
i % 2 != 0
:奇数位(例如,i = 1, 3, 5, ...
)。
-
-
由于
ans
是逆序存储的,i = 0
对应的是二进制的最低位(即第 0 位),i = 1
对应的是第 1 位,依此类推。 -
数组从右往左看!!!
-
-
统计 1 的个数:
-
遍历
ans
,统计偶数位和奇数位上值为1
的个数,分别存储在num1
和num2
中。
-
-
返回结果:
-
最终结果是一个长度为 2 的
vector<int>
,其中第一个元素是偶数位上1
的个数,第二个元素是奇数位上1
的个数。
-