9.回文数 力扣

力扣第九题 回文数

记录总结

  1. 负数一定不是回文数;
  2. 0~9一定是回文数;
  3. 数学解法,同时从左右两边取数,每取一次比较一次,相同则继续,不同则直接false;
  4. 利用中间变量,计算数的位数count;
  5. %10取数,取完之后/10去掉取了的位数 (右边),左边则是原数减去所取数*所在位数
  6. 需要注意的点就是在通过%10,/10获取每一位上的数以及改变书的大小时,要注意0不能当作除数,要先判断/10之后是否为0。

本人解法

class Solution {  //AC第一版
public:
    bool isPalindrome(int x) 
    {
        if(x<0)return false; //负数一定不是回文数
        if(x==0)return true; //0
        int count_wei = 1;
        int temp_1=x,temp_2 = x;
        while (temp_1 / 10 != 0)
        {
             count_wei++;
            temp_1 /= 10;
        }
         int i = count_wei/2;
        temp_1 = x;
        int t = pow(10, count_wei-1);
        while (temp_1 != 0 && temp_2!=0 && t!=0&& ((temp_1 % 10) == (temp_2 /t)) &&count_wei>i) //先判断除数是否为0
        {
            temp_1 /= 10;
            temp_2=temp_2- (temp_2 / (t))* t;
            count_wei--;
            t = pow(10, count_wei-1);
        };
        if (count_wei == i)return true;
        else   return false;
    };
};
//修改版  参考题解思想 减少了一个变量
class Solution {
public:
    bool isPalindrome(int x) 
    {
        if(x<0)return false;
        if(x>=0 && 9>=x) return true;
        int count_wei = 1;
        int temp_1=x;
        while (temp_1 / 10 != 0)
        {
             count_wei++;
             temp_1 /= 10; //计算输入的数有几位
        }
         int i = count_wei/2; //左右同时比较,只需要比较一半就好
        temp_1 = x;
        int t = pow(10, count_wei-1);  //用以取左边的数
        while (temp_1 != 0 && ((temp_1 % 10) == (temp_1 /t)))//循环条件判断也是从左到右的,取右边最后一位///与取左边第一位比较
        {
            temp_1=temp_1- (temp_1 / t)* t; //取完左边第一位去掉最左边第一位
            temp_1 /= 10;  // 取完右边第一位,去掉最右边第一位
            count_wei-=2; //总的位数-2
            t = pow(10, count_wei-1);
        };
        if (temp_1 == 0 )return true; //刚好取到中间
        else   return false;
    };
};

官方题解 参考

  • 还是需要对位数进行统计
class Solution {
public:
    bool isPalindrome(int x) 
    {
        if(x<0)return false;
        if(x>=0 && 9>=x) return true;
        //采用题解解法3  一边取数一边减小,然后比较
        int revertNum=0,temp=x,y=0,count=1;
        while(temp/=10)count++;
        temp=x;
        while(temp>revertNum)
        {
            y=temp%10;
            revertNum=revertNum*10+y;
            temp/=10;
        }
        if((count%2==0)&&temp==revertNum) return true;
        else if((count%2!=0)&&(revertNum/10) == temp&&(temp!=0))return true;
        else return false;
    };
};
  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值