LeetCode-9. Palindrome Number

Description

这里写图片描述

Some Hints

这里写图片描述

Solution 1(C++)

class Solution {
public:
    bool isPalindrome(int x) {
        if(x<0||(x!=0 && x%10==0)) return false;
        int y=0;
        while(x>y)
        {
            y = y*10+x%10;
            x = x/10;
        }
        return (x==y)||(x==y/10);
    }
};

算法分析

这道题有一些地方确实要吐槽,所有负数在这道题中都认为不是回文数。这就很尴尬了。

然后说回自己做的时候注意到的坑与没注意到的坑。确实想到了如何反转一个整数。不过确实要考虑到翻转的时候会产生溢出的情况。但是问题巧妙的地方就在此,原本反转所有整数是想通过比较翻转前与翻转后的两个数是否相等。如果相等说明数是回文数,如果不等,那么就说明不是回文数。

那么解决这个问题有一种显而易见治标不治本的方法,就说使用更大的数据范围,比如double、long等。但是仔细思考一下,为了保证不超过int_max,我们能不能采用折衷的方法来达到同样的目的呢?其实仔细思考一下回文数的特征,那么不难想到,如果我们只将原来的数翻转一半就不难想到办法。

翻转一半,我觉得这是这也是一种思想,既“正面行不通,从反面开始”,我觉得这是“全程走不完,走一半看一半”。前一种思想可以参考:
LeetCode-406. Queue Reconstruction by Height
LeetCode-453. Minimum Moves to Equal Array Elements

此外还要注意的一点就是,能被10整除的数要排除掉。这个我是真没想到。因为末尾为0的整数按照这样运算,y始终为0,而x始终大于y。

算法分析

略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值