9.回文数

9. 回文数

这个题虽然是简单题,但也是从最朴素的思路出发,再进行优化。

读题后首先想到的是,将输入数值x转换为字符串,然后再利用双指针,从左右端点往中间收缩,两两比较,判断是否为回文字符串。如果是回文字符串,则必然是回文数。

第一次提交

class Solution {
    /**
     * 时间复杂度O(n) 空间复杂度O(n)
     */
    public boolean isPalindrome(int x) {
        if (x < 0) return false;
        if (x == 0) return true;
        // 第一次循环n
        // 内存占用n
        String str = "";
        while (x > 0) {
            str += x % 10;
            x /= 10;
        }
        // 第二次循环n/2
        int left = 0;
        int right = str.length()-1;
        while (left <= right) {
            if (str.charAt(left) != str.charAt(right)) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}

这样的提交可以跑过用例,但难以获得很好的分数。分析下代码,假设输入值是一个大数时,这种方法需要开辟一个O(n)的字符串,且使用了两次循环,应该是还有优化空间的。

考虑是否可以将空间优化到常数级别,以及能否在一次循环内完成计算。

既然通过转换为中间结果(回文字符串)的方法行不通,那么我们从输入值的特征上想一想是否能找到突破口。

  1. 对于一个字符串我们可以通过随机访问串上的任意位置的字符,而数字则不行
  2. 回文字符串正反顺序为同一个串,那么回文数正序与反序的数值是一样大的。

基于特征1,可以发现遍历数字的每一位的同时,判断与该位置相对的高位是否相同必然是不可行的(不开辟临时空间的情况下)。
基于特征2,我们可以在遍历的过程中,构造出输入值x的回文数表示y,在遍历结束后,再与x做比较。

第二次提交

class Solution {
    /**
     * 时间复杂度O(n) 空间复杂度O(1)
     */
    public boolean isPalindrome(int x) {
        if (x < 0) return false;
        // x的替身
        int temp = x;
        int y = 0;
        while (temp > 0) {
            // 构造出x的回文数表示
            y *= 10;
            y += temp % 10;
            temp /= 10;
        }
        return x == y;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值