【LeetCode】3.回文数

19 篇文章 0 订阅

0.题目分析

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

首先可以分析如果这个数是负数,肯定不是回文数。

1.方法一 先将整数反转再判断

首先想到的思路是将第2道题的整数反转方法先用于整数反转,然后再判断反转前后两数字是否相同。

代码比较简单,如下:

class Solution {
public:
    bool isPalindrome(int x) {
    int a = 0;
    int b=x;
	if (x >= 0)
	{
		while (x / 10)
		{
			a = a * 10 + x % 10;
			x /= 10;
		}
		a = a * 10 + x % 10;
        if (a==b)
        {
            return true;
        }
        else
            return false;
	}
    else 
        return false;
        
    }
};

有一个循环,循环里的是常数时间复杂度,所以整体时间复杂度是O(log10N)。

2.方法二 反转一半整数

首先考虑平凡的情况:

(1).x<0 显然不是回文数

(2).如果x末尾是0,显然不是回文数。单独将它拿出来的原因是之后算法可能处理不了这种情况。

然后算法进行中怎么判断是否达到一半呢?如果该数是回文数,比如x=1221,那么将原数不断除以10,且同时得到新的数,达到中间的数的情况是x=12和a=12,如果没到达中间的情况,那么x>a;所以可以以此判断是否达到中间;如果该数不是回文数,比如x=5432,那么用此条件判断时,x=5,a=234,虽然如此,但也不影响判断。

还有一个问题是如果x是奇数怎么办?比如x=12321,此时终止循环后,x=12,a=123,只需再比较x==a/10即可。

代码如下:

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

虽然时间复杂度也是O(log10n)但是终止得比较早,时间如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值