【每日一题】LeetCode. 9. 回文数

每日一题,防止痴呆 = =

一、题目大意

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
在这里插入图片描述
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number

二、题目思路以及AC代码

这几天因为毕设要结束的原因,老是没时间写题,今天答辩完啦,撒花,来写道题 ^_^。

思路一

本题就是一个常见的回文数问题,题目提到不要将数字转化为字符串。我一琢磨,这不是一样的吗,只要用一个栈就解决了呀,首先对于负数肯定是不符合要求的,其次0我们也可以单独处理,那么剩下的我们只要按位压栈,然后再将出栈元素与整数的每一个位比较一下就好了。这样的时间复杂度是O(logn),但会占用额外的空间,注意这里的n是那个整数,并不是指整数的长度。

思路二

另外一个就是官方解答的思路,我们可以考虑将整数的后半部分翻转,如果和前半部分一致,那不就证明是回文数了吗?我们只要按位遍历整数,然后用一个变量存储后半部分的翻转,并且当翻转数大于原数的时候停止,此时判断原数是否等于翻转数(长度为偶数)或者是否等于翻转数除以10(长度为奇数)就可以了,具体看代码吧,很容易懂。当然这种方式要注意把尾数为0的情况去掉,不然翻转数会少一位 = =。这种方法的时间复杂度同样是O(logn),但没有额外占用栈空间。

两种思路虽然时间复杂度的量级是一致的,但相差一个常数的倍数,其实还是后一种方法更快些,也更加简洁,学到了。

AC代码

思路一:

class Solution {
public:
    bool isPalindrome(int x) {
        if (x < 0) return false;
        if (!x)  return true;

        stack<int> m_stack;
        int num = x;
        while (num != 0) {
            m_stack.push(num % 10);
            num /= 10;
        }

        while (x != 0) {
            int cur = m_stack.top(); m_stack.pop();
            if (x % 10 != cur) return false;
            x /= 10;
        }

        return true;
    }
};

思路二:

class Solution {
public:
    bool isPalindrome(int x) {
        if (x < 0) return false;
        if (!x)  return true;
        if (x % 10 == 0) return false;

        int reversed_num = 0;
        while (x > reversed_num) {
            reversed_num *= 10;
            reversed_num += x % 10;
            x /= 10;
        }

        return reversed_num == x || x == reversed_num / 10;
    }
};

如果有问题,欢迎大家指正!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值