代码:
题目解析:二进制回文串
> * 一、题目核心要求
>
> 给定整数 n,统计 1 到 n 范围内所有满足「二进制表示是回文数」的数字数量。
> 二进制回文数:
> 数字转换为二进制字符串后,正读和反读完全一致(例如:5 的二进制是 101,是回文数;6 的二进制是 110,不是回文数)。
> 数据范围:1 ≤ n ≤ 10^5,时间限制 1 秒,内存限制 128MB。
> * 二、解题思路
>
> 核心思路分为三步,逐个检查 1~n 的每个数字:
> 十进制转二进制:将当前数字转换为二进制字符串(注意二进制无前导零);
> 判断回文:对比二进制字符串与其反转后的字符串是否一致;
> 统计数量:若一致则计数加 1,最终输出总计数。
> * 三、关键细节说明
>
> 十进制转二进制的实现:
> num & 1:位运算快速获取二进制最后一位(比取余 num % 2 效率更高);
> binary = 字符 + binary:将每一位拼在字符串头部,保证二进制字符串的正序(例如:5 → 先取 1 → "1",再取 0 → "01",最后取 1 → "101");
> num >>= 1:右移运算等价于整除 2,逐步缩小数字直到为 0。
> 回文判断:
> 利用 algorithm 库的 reverse 函数反转字符串,直接对比原字符串和反转后的字符串是否相等,简单直观。
> 样例验证(输入 15):1~15 的二进制回文数有:
> 1(1)、3(11)、5(101)、7(111)、9(1001)、15(1111),共 6 个,与样例输出一致。
> * 五、算法效率分析
>
> 时间复杂度:O(n * log n)。遍历 1~n(O (n)),每个数字转二进制需要 log2(n) 次循环,回文判断需要 log2(n) 次字符对比,整体复杂度在 n ≤ 10^5 时完全满足时间限制。
> 空间复杂度:O(log n)。仅需存储单个数字的二进制字符串,空间开销极小。
> 总结
> 核心逻辑:十进制转二进制 + 回文判断,两步即可解决问题;
> 关键技巧:用位运算(& 1、>> 1)替代算术运算,提升二进制转换效率;
> 边界注意:从 1 开始遍历(0 的二进制无意义,题目要求 1~n),二进制字符串无需处理前导零。