码迷,mamicode.com
首页 > 其他好文 > 详细

回文判断

时间:2016-08-13 22:44:28      阅读:520      评论:0      收藏:0      [点我收藏+]

标签:

一个整形数是否是回文

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:  }
 

举一反三

1、判断一条单向链表是不是“回文”

分析:对于单链表结构,可以用两个指针从两端或者中间遍历并判断对应字符是否相等。但这里的关键就是如何朝两个方向遍历。由于单链表是单向的,所以要向两个方向遍历的话,可以采取经典的快慢指针的方法,即先位到链表的中间位置,再将链表的后半逆置,最后用两个指针同时从链表头部和中间开始同时遍历并比较即可。

2、判断一个栈是不是“回文”

分析:对于栈的话,只需要将字符串全部压入栈,然后依次将各字符出栈,这样得到的就是原字符串的逆置串,分别和原字符串各个字符比较,就可以判断了。

Technorati 标签:

回文判断

标签:

原文地址:http://www.cnblogs.com/yuyounglife/p/5769026.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!