Palindrome Number(回文数字)

Determine whether an integer is a palindrome. Do this without extra space.(判断一个整型数是否是回文,要求不能借用额外的空间)

1.个人分析
题目中的额外空间应该是指空间复杂度为O(1),所有的负数不属于回文数。

2.个人解法

bool isPalindrome(int x) 
{
    if(x > INT_MAX || x < 0)
        return false;
    int count = 0;
    long long tmp = abs(x);
    while(tmp > 10){
        ++count;
        tmp /= 10;
    }

    tmp = abs(x);
    int low, high;
    while (count > 0)
    {
        high = tmp / pow(10.0, count);
        low = tmp % 10;
        if(high != low)
            return false;
    }

    return true;
}

该解法试图使用“双指针”方法从整数的两端分别进行比较,但该过程无法实现预期目标结果。

3.参考解法
(1)

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

    return (x == sum) || (x == sum/10);
}

该解法是通过先取得反转后一半的结果,然后再比较前一半和后一半是否相等,这种方法很好的解决了将整个数字反转后可能出现溢出的情况。

(2)

bool isPalindrome(int x)
{
    if(x < 0)   return false;
    int ranger = 1;
    while(x / ranger >= 10)
        ranger *= 10;
    while(x){
        int left = x / ranger;
        int right = x % 10;
        if(left != right)
            return false;
        x = (x % ranger) / 10;
        ranger /= 100;
    }

    return true;
}

该解法才正确地解决了个人解法的问题,思路也是通过“俩指针”不断比较左右两端的数字是否相等。

4.总结
刚开始并没有意识到负数不是回文数,所以就认为判断负数是否回文只要判断相应的绝对值就行。另外自己在解决思路上是没错的,无奈找不到合适的具体实现方法,所以还需在实际的操作方法上多积累。

PS:

  • 题目的中文翻译是本人所作,如有偏差敬请指正。
  • 其中的“个人分析”和“个人解法”均是本人最初的想法和做法,不一定是对的,只是作为一个对照和记录。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值