#include
#include
#include
int solution(int N) {
std::string binary_representation = std::bitset<32>(N).to_string();
size_t first_one = binary_representation.find('1');
if (first_one != std::string::npos) {
binary_representation = binary_representation.substr(first_one);
} else {
binary_representation = "0";
}
for (char &bit : binary_representation) {
bit = (bit == '0') ? '1' : '0';
}
int result = std::stoi(binary_representation, nullptr, 2);
return result;
} int main() { std::cout << (solution(5) == 2) << std::endl; std::cout << (solution(10) == 5) << std::endl; std::cout << (solution(0) == 1) << std::endl; return 0; } 算法思路 输入处理: 函数 solution 接收一个整数 N 作为输入。 获取二进制表示: 使用 std::bitset<32>(N).to_string() 将整数 N 转换为32位的二进制字符串表示。 找到第一个1的位置: 使用 std::string::find('1') 方法找到二进制字符串中第一个 '1' 的位置。 如果找到了 '1',则截取从第一个 '1' 开始到字符串末尾的子串。 如果没有找到 '1'(即 N 为0),则将二进制字符串设置为 "0"。 二进制位翻转: 遍历截取后的二进制字符串,将每个 '0' 替换为 '1',每个 '1' 替换为 '0'。 转换回整数: 使用 std::stoi(binary_representation, nullptr, 2) 将翻转后的二进制字符串转换回整数。 返回结果: 返回转换后的整数作为结果。 算法分析 时间复杂度 获取二进制表示:std::bitset<32>(N).to_string() 的时间复杂度是常数时间 O(1),因为位数是固定的32位。 找到第一个1的位置:std::string::find('1') 的时间复杂度是线性时间 O(k),其中 k 是字符串的长度(在这个情况下是32)。 二进制位翻转:遍历字符串的时间复杂度是线性时间 O(m),其中 m 是截取后的字符串长度(最坏情况下是32,最好情况下是1)。 转换回整数:std::stoi 的时间复杂度也是线性时间 O(n),其中 n 是字符串的长度(同样最坏情况下是32)。 综合以上步骤,总的时间复杂度是 O(32),即常数时间 O(1)。 空间复杂度 二进制字符串:存储32位的二进制字符串,空间复杂度是 O(1)。 截取后的字符串:在最坏情况下,截取后的字符串长度仍然是32,空间复杂度也是 O(1)。 因此,总的空间复杂度是 O(1)。