【力扣】9.回文数
转化成字符串之后进行判断的思路很简单咱就不写了。
做一下进阶:你能不将整数转为字符串来解决这个问题吗?
我最初的思路:用二进制掩码异或判断。
学到了新知识:GCC内建函数__builtin_clz(
Count Leading Zeros,统计前导零个数)->获取二进制正数最大有效位。
细节:注意掩码获取时int最高位1往低位走时的步数。譬如,假设int有4bits,想要获取前两位是1的掩码,1100即1<<(4-1)>>(2-1)得到.一定一定不要乱了。
但,有一个漏洞我居然直接忽略了,我想当然地觉得十进制是回文二进制也是了(呜呜呜)
先贴一个给定十进制数判断其二进制是否回文吧,不能白写嗯嗯。
这个结合题目可以判断双基回文。//给定十进制数判断其二进制是否回文
#include <iostream>
#include <limits.h>//__builtin_clz所在的头文件
using namespace std;
unsigned msbn(int x)
{
// 获取有效位数,最大有效位是有效位数-1
return sizeof(int) * CHAR_BIT - __builtin_clz(x);
}
int main()
{
int x = 313;//这是一个双基回文捏
int goto_highest = sizeof(int) * CHAR_BIT - 1;
int offset = (msbn(x) - 1) / 2 + 1;
int h_step = __builtin_clz(x) - 1; // 高位:1从高往低走 0数目-1 步
int l_step = h_step + offset; // 低位:多走n的一半(向上取整)步
cout << h_step << " " << l_step << endl;
int lower_mask = ~(1 << goto_highest >> l_step);
int higher_mask = ~(1 << goto_highest >> h_step | lower_mask);
cout << higher_mask << " " << lower_mask << endl;
cout << (((x & lower_mask) ^ ((x & higher_mask) >> offset)) == 0) << endl;
return 0;
}
十进制回文判断:%和/就能解决(捂脸)
翻转一半的数字,节省时间防溢出。
bool isPalindrome(int x)
{
int left = x / 10, right = x % 10;
if (x < 0 || x != 0 && right == 0)
return false;
while (right < left)
{
right = right * 10 + left % 10;
left /= 10;
}
return left == right || left == right / 10;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具