首页 > 其他分享 >【力扣】9.回文数

【力扣】9.回文数

时间:2023-10-11 16:02:57浏览次数:32  
标签:10 right int 力扣 step 回文 left

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

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

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

学到了新知识: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;
}

标签:10,right,int,力扣,step,回文,left
From: https://www.cnblogs.com/sharlynOUO/p/17756949.html

相关文章

  • nginx配置返回文本或json的方法
    下面是讲解“nginx配置返回文本或json的方法”的完整攻略。方法一:返回文本在nginx配置文件中,使用add_header指令来设置响应头部信息,如下所示:location/text{add_headerContent-Typetext/plain;return200"Hello,World!";}上述配置中,location指明请求的URI为......
  • 力扣-2367-算术三元组的数目
    给你一个下标从0开始、严格递增的整数数组nums和一个正整数diff。如果满足下述全部条件,则三元组(i,j,k)就是一个算术三元组:i<j<k,nums[j]-nums[i]==diff且nums[k]-nums[j]==diff返回不同算术三元组的数目。 示例1:输入:nums=[0,1,4,6,7,10],di......
  • 力扣-2744-最大字符串配对数目
    给你一个下标从0开始的数组words,数组中包含互不相同的字符串。如果字符串words[i]与字符串words[j]满足以下条件,我们称它们可以匹配:字符串words[i]等于words[j]的反转字符串。0<=i<j<words.length请你返回数组words中的最大匹配数目。注意,每个字符串最......
  • 力扣-2006-差的绝对值为 K 的数对数目
    给你一个整数数组nums和一个整数k,请你返回数对(i,j)的数目,满足i<j且|nums[i]-nums[j]|==k。|x|的值定义为:如果x>=0,那么值为x。如果x<0,那么值为-x。示例1:输入:nums=[1,2,2,1],k=1输出:4解释:差的绝对值为1的数对为:-[1,2,2,1]-[1,2,2,1]-......
  • 力扣-2574-左右元素和的差值
    给你一个下标从0开始的整数数组nums,请你找出一个下标从0开始的整数数组answer,其中:answer.length==nums.lengthanswer[i]=|leftSum[i]-rightSum[i]|其中:leftSum[i]是数组nums中下标i左侧元素之和。如果不存在对应的元素,leftSum[i]=0。rightSum[i]是数组n......
  • 力扣-2114-句子中的最多单词数
    一个句子由一些单词以及它们之间的单个空格组成,句子的开头和结尾不会有多余空格。给你一个字符串数组sentences,其中sentences[i]表示单个句子。请你返回单个句子里单词的最多数目。 示例1:输入:sentences=["aliceandbobloveleetcode","ithinksotoo","......
  • 八股乱背,力扣不会!下辈子远离计算机
    昨天接到了许久未见老友的一个电话,片刻寒暄之后聊到主题:朋友受人之托,帮人打听家中小孩选择计算机专业之后的就业问题的。既然是朋友,自然不敢欺瞒,就把目前计算机就业相关的真实情况如实“汇报”了。那么计算机行业现状如何呢?大家看这幅图自然就明白了:杭州一家不知名的公司(我从......
  • LeetCode 125 验证回文串
    LeetCode125验证回文串1.题目地址https://leetcode.cn/problems/valid-palindrome/?envType=study-plan-v2&envId=top-interview-1502.题解这道题比较简单,思路如下:1.对源字符串进行处理,过滤掉非字母数字字符。这里需要注意:我们要将大写字母统一转换成小......
  • 力扣刷题笔记-08 字符串转整数
    08字符串转整数属于对字符串进行操作的问题百无一用是情深问题字符串里有数字,空格,正负号等,需要先过滤出来在这道题目里,我们通常考虑字符串的组合是“空格+正负号+数字”,一开始我想可能是“正负号+空格+数字”,但是这样的组合根本不可能是数字啊,没什么意义。循环条件for循......
  • 力扣刷题笔记-07 整数反转
    07整数反转狗看了都摇头的年纪,纯爱战士一败涂地。怎么反转temp用来保存个位数res用来保存当前结果123,取模运算,这样就可以获得最后一位。比如对123%10,得到temp=3.判断res是不是溢出(重点)如果没有溢出,res扩大十倍,再加上个位数,就相当于是反转了。res=res*10+temp;返回......