一个整形数是否是回文
also leetcode 9 Palindrome Number
要求空间复杂度O(1)
按位判断一般是/
和%
的游戏,首先取首位 a/h
(h是最接近a的10的次方,比如12321
,h预计算出是10000
), 再取末位a%10
; 比较首位和末位是否相等,不等就返回false;
如图:
然后舍弃掉已经比较过的两个位数,从a中去掉首尾 12321 --> 232
.
a = a % h; // 去掉首
a = a /10; //去掉尾
h = 100; // 因为已经去掉了两位
如图:
重复之前操作即可,如图:
1: public boolean isPalindrome(int x) {
2: int a = x, h =1;
3: if(a < 0) return false;
4:
5: while(a / h>= 10) {
6: h = h*10;
7: }
8: //compare the last and first digit and will not overflow
9: while(a> 0) {
10: if(a/h != a%10) return false;
11: a = a%h;
12: a = a/10;
13: h = h/100;
14: }
15: return true;
16: }
判断一个字符串是否是回文串:
有着两种方法可以进行判断,一种是回文串两端往中间进行比较,另一种就是回文串从中间向两端递进,进行比较。
1: /* 从两端开始扫描判断 */
2: int IsPalindroom(char *s, int n)
3: {
4: if(s == NULL || n < 1)
5: return -1;
6:
7: char *fornt, *back;
8: fornt = s;
9: back = s + n - 1;
10:
11: while(fornt < back)
12: {
13: if(*fornt != *back)
14: return -1;
15:
16: fornt++;
17: back--;
18: }
19:
20: return 0;
21: }
22:
23: /* 从中间开始向两端扫描判断 */
24: int IsPalindroom(char *s, int n)
25: {
26: if(s == NULL || n < 1)
27: return -1;
28:
29: int m = ((n >> 1)-1 >= 0) ? (n >> 1)-1 : 0;
30: char first = m;
31: char second = n -1 - m;
32:
33: while (first >= 0)
34: if (s[first--] != s[second++])
35: return -1; // not equal, so it‘s not apalindrome
36:
37: return 0; // check over, it‘s a palindrome
38: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
举一反三
1、判断一条单向链表是不是“回文”
分析:对于单链表结构,可以用两个指针从两端或者中间遍历并判断对应字符是否相等。但这里的关键就是如何朝两个方向遍历。由于单链表是单向的,所以要向两个方向遍历的话,可以采取经典的快慢指针的方法,即先位到链表的中间位置,再将链表的后半逆置,最后用两个指针同时从链表头部和中间开始同时遍历并比较即可。
2、判断一个栈是不是“回文”
分析:对于栈的话,只需要将字符串全部压入栈,然后依次将各字符出栈,这样得到的就是原字符串的逆置串,分别和原字符串各个字符比较,就可以判断了。
Technorati 标签: 算法