Leetcode-9.回文数

本人小白 接下来的用来记录我Leetcode刷题 我本人基础很差 所以选择从最简单的开始,仅仅作为记录自己刷题时的想法。

1:这个题目一看到我寻思用反转数字的方法来做,直接用数字来取余然后进行全部反转操作,也就是下面这段代码

class Solution {
public:
    bool isPalindrome(int x) {

    //     string s1 = (string) x;
    //     string s2 = "";
    //     for(int i = s1.size()-1;i>=0;i--)
    //     {
    //         s2.push_back(s1[i]);
    //     }
    //     if(s1 == s2) return true;
    //     else return false;
    // }
    if(x<0) return false;
    if(x == 0) return true;
    if(x%10 == 0) return false;
    //if(x == 0) return true;
    long sum = 0;
    // for(int i = 0;sum<=x;i++)
    // {
    //     sum+=(x%10)*pow(10,i);  
    //     x/=10;
    //     if(sum == x) return true;
    // }
    int Flag = x;
    //while(x>sum)
    while(x>0)
    {
        sum = sum*10+x%10;
        x/=10;
    }
    //if(x == sum) return true;
    if(sum == Flag) return true;
    //sum/=10;
    //if(x == sum) return true;
    //x = x+sum%10;
    //if(x== sum) return true;
    return false;

    }
}

但是程序最后显示运行超出范围,经过调试,是sum超出了范围,如果将sum改为long类型就可以运行成功,为什么会超出范围呢,经过分析,假设int类型最大可存储128个字节,然后sum如果也是反转的话,为int类型,那么就为821,超出int字节的范围,所以这是一个错误。

2:看了Leetcode上的解题,有个方法很好,就是将sum只判断一半的数字然后再和前面一半的x进行比较,这样如果sum是int类型的话就不会有溢出的情况了,但是还需要加一个判断方式,就是如果位数是奇数的话,那么中间那一位是不需要看的,一定是对称的,所以将奇数的那一位除去也行,加上也行,也就是下面这段代码

class Solution {
public:
    bool isPalindrome(int x) {

    //     string s1 = (string) x;
    //     string s2 = "";
    //     for(int i = s1.size()-1;i>=0;i--)
    //     {
    //         s2.push_back(s1[i]);
    //     }
    //     if(s1 == s2) return true;
    //     else return false;
    // }
    if(x<0) return false;
    if(x == 0) return true;
    if(x%10 == 0) return false;
    //if(x == 0) return true;
    int sum = 0;
    // for(int i = 0;sum<=x;i++)
    // {
    //     sum+=(x%10)*pow(10,i);  
    //     x/=10;
    //     if(sum == x) return true;
    // }
    while(x>sum)
    {
        sum = sum*10+x%10;
        x/=10;
    }
    if(x == sum) return true;
    sum/=10;
    if(x == sum) return true;
    //x = x+sum%10;
    //if(x== sum) return true;
    return false;

    }
};

3:第三种方法就是通过C++自带的to_string函数,将int类型的数据转换为string类型,然后再进行判断,这个就不需要关心数据溢出问题,而且转换为string类型之后可以有两种解法,一种就是用两个变量,min一个存储第一位,max一个存储最后一位,如果,两个指针在不断++和--的过程中,判断是否相等,然后如果min>max了就退出循环,这是从Leetcode上看到的解题方法,本人想的是,先定义一个空字符串,然后通过一个for循环,设置i变量为string的最大长度-1,然后再用string的push_back()方法,将string的i-1存放到该空字符串中,然后判断新的字符串和原字符串是否相等。这种方法仅口头描述,不实现

4:用python的str转换可以更简单的实现,其中可以用我在网上查到的循环反向迭代法,也可以将str转换为列表,然后再用列表的reverse方法逆置,最后判断两个是否相等,例如下图。后面才发现还可以用python中的逆序操作a[::-1]然后直接读取赋值就行

class Solution:
    def isPalindrome(self, x: int) -> bool:
        s1 = str(x);
        s2 = ""
        for i in s1:
            #循环反向迭代法
            s2 = i + s2
        if s1 == s2 :
            return True
        else:
            return False

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值