【算法】不利用额外空间判断回文数

题目:http://leetcode.com/2012/01/palindrome-number.html


Determine whether an integer is a palindrome. Do this without extra space.


1.输入检测:如果输入的integer是负数,返回false

2.“额外空间”的大坑:用string来存放integer,使用了额外空间

3.“溢出”的大坑:如果把回文数整个倒过来,再比较是否相同,这种方法可能是可行的。但会出现有些整数倒置后溢出,再处理溢出就与具体环境有关了,不具有普遍性

将一个数倒置的算法:

// reverse an integer

int reverse(int num){
	assert(num>=0); // for non-negative integers only
	int rev = 0;
	while(num!=0){
		rev = 10*rev + num%10;
		num = num/10;
	}
	return rev;
}


4.好的思路一:

不使用递归来从两端对比数字是否一样:

算法:

bool isPalin(int num){
	if(num<0)
		return false;
	
	// get the left most digit
	int div = 1;
	while(num/div!=0){
			div *= 10;
	}
	
	while(num!=0){
		int r = num/div;
		int l = num%10;
		if(l!=r)
			return false;
		num = (num%div)/10;
		div /= 100;  // attention!! 100 not 10, because everytime div shrink by 2 digits
	}
	return true;
	
}

5.如果栈空间不算额外空间的话,可以利用递归的方法

算法:(比较难读懂= =)

bool isPalindrome(int x, int &y) { 
 if (x < 0) return false;
  if (x == 0) return true;
  if (isPalindrome(x/10, y) && (x%10 == y%10)) {
    y /= 10;
    return true;
  } else {
    return false;
  }
}
bool isPalindrome(int x) {
  return isPalindrome(x, x);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值