整数反转与回文数问题

整数反转与回文数问题

将整数最高位变为最低位,对称反转。反转后的数字与原数字相等即为回文数。

整数反转

初始思路

将数字转换为字符串数组,数组反转 。利用 StringBuilder 的reverse函数。

这种方法效率并不高,但容易理解与思考

优化题解

考虑到每一位数字之间是10进制的关系,可以将数字看做一个栈,利用取余(%10)得到顶部数据。第一个数字是个位数字,第二个数字是个位数字乘以10加上十位数字,依次迭代可以得到反转数字。

  • 注意反转的时候可能会产生溢出的数字,即 当数字乘以10大于最大值,这种情况返回0;
class Reverse{
	
	public int reverse(int x){
		int rev = 0;
		while(x > 0){
			//栈顶,第一位为个位数字
			int pop = x %10;
			x /= 10;  //弹栈
			//判断是否会溢出
			if(rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE/10 && pop > 7))return 0;
			if(rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE/10 && pop <-8))return 0;
			rev = rev*10 + pop;
		}
		return rev;
}

回文数问题

初始思路

最开始,直接的想法就是两个指针,从首尾同时向中间移动,如果有不一样的数字就不是回文数。这里需要将整数转换为字符串,利用数组的思想。

进一步的想法

可以利用之前的反转数字方法,将数字反转后如果与原数字相等,就是回文数。

优化

因为数字反转可能会产生溢出的情况,而且回文数是对称的,考虑我们是否可以将数字分为两半,前一半反转,后一半作为目标比较。同时由于负数的负号一定不是回文,所以负数直接判定为false;
我们可以用反转数字的方法,从末尾开始反转数字,以期待获得反转后一半的数字。此处如何判断已经反转了一般的数字就成了一个问题:按照反转数字的算法,我们的原数字在减少,反转数在增加,所以当原数字小于等于反转数时,我们就已经反转了一半数字了。同时,当出现奇数位时,我们最终获得的 反转数/10 == 原数字 即是答案;是偶数时,反转数 = = 原数字 是答案。

class Solve{
	public boolean solution(int x){
		if(x < 0 || (x != 0 && x % 10 == 0))return false;
		int rev = 0;
		while(rev < x){
			rev = rev*10 + x %10;
			x /= 10;
		}
		return rev == x || rev/10 ==x;

温故知新,未央书斋。

你可能感兴趣的:(刷题笔记,后端相关,字符串,java,算法)