回文:从左遍历和冲右遍历的结果一样, 其实就是一个字符串或者一个数是对称的,对称轴是中间的数或中间的间隔
判断回文字符串:
- 设置两个指针,一个从左边开始遍历,另一个从右开始遍历,并设置哨兵,依次比较两个元素的值;两值相同则哨兵为true,进入下一次遍历,当左边遍历到右边,右边遍历到左边时跳出循环;(这里可以改进,左右各自遍历到字符串中间的位置即可)若两值不同,哨兵为false,结束判断。
public class 回文字符串 {
public static void main(String[] args) {
String s="12321";
boolean result=huiwen(s);
System.out.println(result);
}
public static boolean huiwen(String str)
{
boolean flag=true;
int i=0;
int j=str.length()-1;
while(i<=str.length()-1&&j>=0)
{
if(str.charAt(i)==str.charAt(j))
{
flag=true;
i++;
j--;
}
else {
flag=false;
return flag;
}
}
return flag;
}
}
- 使用StringBuffer中的字符串反转方法,字符反转后如果跟原来一样,不就是回文字符串了吗?
public class 回文字符串_reserve方法 {
public static void main(String[] args) {
String s="1232w1";
boolean result=huiwen1(s);
System.out.println(result);
}
public static boolean huiwen1(String str)
{
String xstr=new StringBuffer(str).reverse().toString();
if(str.equals(xstr))
{
return true;
}
else{
return false;
}
}
}
当然了,这两个都是脑子容易想到的简单方法,可以但效率不高。
3.反转后一半数字
1.首先考虑特殊情况
1.1、负数不可能是回文数
1.2、个位数字为0的多位数不是回文数
1.3、 0,1,2,3…个位数是回文数
2.一般情况
因为回文数是对称的,前一半等于后一半,所以把后一半反转出来跟前一半比较,如果相等则是回文数。
.怎么反转出后一半?
数字%10得个位数字,数字/10后,减少了原来的个位数字,
设before为带判断的数/10后的结果,
ge为切分出来的个位数字,
after为反转出来后一半数字;
当切到中间的时候停止切分,判断前一半和后一半
.怎么知道切到中间了?前一半小于后一半呗!
如果是奇数,前一半<后一半时,把后一半去掉最后一位数字,前后相同,为回文数;
如果是偶数,前一半=后一半,为回文数
public class 回文数 {
public static void main(String[] args) {
int s=666661;
boolean result=huiwenshu(s);
System.out.println(result);
}
public static boolean huiwenshu(int num)
{
if(num==0)
{
return true;
}
else if(num<0||num%10==0)
{
return false;
}
int before=num;
int after=0;
int ge=0;
while(before>after)
{
ge=before%10;
before=before/10;
after=after*10+ge;
}
if(before<after) {
after=after/10;
}
if(before==after)
{
return true;
}
return false;
}
}
未完待续~