1. 二进制得分算法解析
这个算法问题涉及到一个有趣的二进制数处理过程。给定一个整数x,我们需要计算它的"二进制得分"。得分计算规则如下:
- 如果x ≤ 1,得分为x本身
- 否则,计算x的二进制表示中1的个数(即汉明重量)
- 如果1的个数是奇数:
- 找到中间那个1的位置(从右往左数)
- 将数分成三部分:中间1左侧的部分、中间1本身、中间1右侧的部分
- 得分为x + 这三部分的得分之和
- 如果1的个数是偶数:
- 找到中间两个1的位置
- 将数分成三部分:左侧部分、中间部分(两个1之间的部分)、右侧部分
- 得分为x + 这三部分的得分之和
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法实现
2.1 计算汉明重量
cpp复制int result1(int x) {
int sum = 0;
while (x) {
x &= (x - 1); // 清除最低位的1
sum++;
}
return sum;
}
这个函数使用了一个经典技巧:x &= (x - 1)会清除x的最低位的1。每次执行这个操作,我们就计数一次,直到x变为0。
2.2 深度优先搜索实现
cpp复制int dfs(int x) {
if (x <= 1) {
return x;
}
int sum = result1(x);
if (sum & 1) { // 奇数个1的情况
// ...处理奇数情况...
} else { // 偶数个1的情况
// ...处理偶数情况...
}
}
3. 奇数个1的处理
当二进制表示中有奇数个1时,我们需要找到中间那个1的位置:
cpp复制string a = bitset<32>(x).to_string();
int mid = max(sum / 2 + 1, 1LL);
int p = 0, pos = 0;
for (int i = 0; i < 32 && mid > p; i++) {
if (x >> i & 1) {
p++;
po
