【力扣】9.回文数

发布时间 2023-10-11 15:57:38作者: SharlynOUO

转化成字符串之后进行判断的思路很简单咱就不写了。

做一下进阶:你能不将整数转为字符串来解决这个问题吗?

我最初的思路:用二进制掩码异或判断。

学到了新知识:GCC内建函数__builtin_clz(Count Leading Zeros,统计前导零个数)->获取二进制正数最大有效位。

细节:注意掩码获取时int最高位1往低位走时的步数。譬如,假设int4bits,想要获取前两位是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;
}