Palindrome Number

原题链接

问题:给定个int数,判断其是否为回文数。

分析:对于回文字符串我们很熟悉,但是题目中要求不能用额外的存储空间,所以不能将其转换为字符串来判断。对于将参数进行逆置的方法,可能会存在溢出的问题,所以题目中也不建议用这种方法,那么还的考虑用回文字符串的比较方式,我们在判断回文串的时候,策略是用最后的和最前的比,相同继续,不同就返回false。若前后相遇则表示是回文,返回true。那么这个怎么获取到最前和和最后呢?对于给定整数的位数我们是可以计算的,那么最高位和最低位就容易知道了,迭代着我们就可以类似于处理回文串那样处理了。

这里我们不用这种方法,题目中说的第二种逆置的方法会出现溢出,其实我们没必要将整个整数都逆置,只要逆置到中间部分就可以了,比如123321,我们逆置后三位得到123就可以了。

那这个举例,详细过程为:

x = 123321,re = 0

1)x = 12332 , re = 1

2)x = 1233,   re =  12

3)x = 123,     re =  123

接下来就不用继续逆置了,因为x的位数已经不比re多了,这就已经在中间均分了,这也正是我们想要的结果。

有的看官可能会说,这个例子巧合,恰好是偶数可分,要是奇数不可分那怎么办呢?比如1234321,我们来看

x  = 1234,   re = 123,这时我们也不再继续逆置了,我们判断的标准是 re == x || re == x / 10,将不能均分的部分作为公共部分,谁也不给,这不影响结果。

//代码

class Solution{
public:
	
bool isPalindrome(int x)
	{
		int cnt = 0;
	        int rever = 0;
		if( x > 0 && x % 10 == 0 || x < 0) return false;
		while (x && (x / 10 > rever))
		{
			rever *= 10;
			rever += x % 10;
			x /= 10;
		}
		if(rever == x || rever == x / 10)
			return true;
		else
			return false;
	
	}
};
程序说明:
1)程序中第一个if 说的是,当给定的整数个为是0的时候,肯定就不是回文说,因为我们会写18但不会写018,对于小于零的数我们也返回false。

2)第二个if 就是处理奇偶的问题。

3)程序中while循环条件是当我剩余的比“已经给你逆置的”还长时,我就接着给你去逆置,否则我再给你我就不够了。

总结:

这样处理虽然可以解决问题,但与用处理回文串的方法不同的是,这样要完全逆置完才能知道是否是回文,而回文串的处理方法中,每比较一位都可以判定是否要继续,不满足就直接返回false结果了。

你可能感兴趣的:(LeetCode,C++,c,标准,回文数判定)