判断一个数字是否为回文数
来源:互联网 发布:快手绝世的容颜淘宝店 编辑:程序博客网 时间:2024/05/21 06:29
Determine whether an integer is a palindrome. Do this without extra space.(source)
判断一个数字是否为回文数,并且不使用额外的存储空间。
“回文”是指正读反读都能读通的句子,那么回文数,就很容易理解,就是指一个数正反读的值是相同的。还有一个要求是不要使用额外的存储空间。
Hints:
要将一个数的最高位与最低位比较,取出一个数的最低位容易(x%10),但要得到高位却很难。
Solution 1:
首先得知道一个负数的处理方法,比如-1是不是一个回文数,在这里我们认为负数都不是回文数。
直观的讲,判断一个回文数可以把该数reverse,如下:
int reverse(int num) { assert(num >= 0); // 只考虑非负数 int rev = 0; while (num != 0) { rev = rev*10 + num%10; num /= 10; } return rev;}
然后与原数比较,return reverse(num)==num; 该算法使用了一个额外的存储空间,并且没有考虑到越界的问题,例如在C++中INT_MAX=2^31-1 = 2147483647的回文数为7463847412就越界了,因此该方法不是很好的方法。
Solution 2:
另外可以将数字转换成字符串之后,判断一个字符串是否为回文。
string int2str(int x){ string ret; if( x == 0 ) ret.push_back('0'); while( x ) { ret.push_back('0' + x%10); x /= 10; } reverse(ret.begin(), ret.end()); // 字符串逆序 return ret;}// 判断回文字符串bool isPalindrome(string str) { int low = 0; int high = str.length()-1; while(low < high) { if(str[low] != str[high]) return false; low++; high--; } return true;}
该方法需要与数字长度相同的字节数的存数空间,也不是一个零存储空间的算法。
Solution 3:
利用高位和低位相等的思想,不会越界,却需要额外的存储空间。
bool isPalindrome(int x) { if (x < 0) return false; int div = 1; while (x / div >= 10) { div *= 10; // div的最高位为1,长度与x相同 } while (x != 0) { int h = x / div; // x的最高位 int l = x % 10; // x的最低位 if (h != l) return false; x = (x % div) / 10; // 去掉x的最高位和最低位 div /= 100; } return true;}
Solution 4:
零存储方法。利用递归的思想,利用栈内存,达到了零存储的目的。
bool isPalindrome(int x, int &y) { // y为必须为引用和指针型可改变的变量 if (x < 0) return false; if (x == 0) return true; if (isPalindrome(x/10, y) && (x%10 == y%10)) { // 每次执行到 x%10 == y%10 的时候 x 为前i位,y表示前(n+1-i)位 y /= 10; return true; } else { return false; }}bool isPalindrome(int x) { return isPalindrome(x, x);}
1 0
- 判断一个数字是否为回文数
- 使用StringBuffer来判断一个数字是否为回文数
- python判断一个数是否为回文数字
- 判断一个数是否为回文数
- 判断一个数是否为回文数
- 判断一个数是否为回文数
- 判断一个数字是否是回文数
- 9.判断一个数字是否为回文
- 判断一个数是否为回文素数
- 判断一个数是否为回文
- 判断一个整数是否为回文数
- 判断一个整数是否为回文数
- 判断一个整数是否为回文数
- 判断一个数是否为回文字符串
- 判断一个整数是否为回文数
- 判断一个整数是否为回文数
- 判断一个数是否为回文
- C语言:判断一个数是否为回文数(回文数也是一个数字,数字的特点是正反序是同一个数字,如:12321,3443)
- CentOS 7.0 启用iptables防火墙
- socket函数
- PAT1066(AVL)
- 杭电 HDU 1021 Fibonacci Again
- 点连通度与边连通度的求解
- 判断一个数字是否为回文数
- libcurl的简单使用
- Illegal overloaded getter method with ambiguous type for property
- 基于ngx_lua模块的waf开发实践
- 欢迎使用CSDN-markdown编辑器
- 概率论--随机事件及运算
- 一道淘汰85%面试者的百度开发者面试题
- ZOJ 2132 the most frequent number
- Windows下OpenLDAP的安装及使用(一)