20191211——回文数 第九题

我自己做出来的

class Solution {
    public boolean isPalindrome(int x) {
        String y = ""+x;
        StringBuffer z =new StringBuffer(y);
        if(z.reverse().toString().equals(y)){
            return true;
        }else{
            return false;
        }
    }
}

先把这个数字转换成字符串,然后再把字符串String类转换StringBuffer类,然后StringBuffer有一个反转reverse的方法,然后反转之后还需要toString方法来转换成字符串,然后进行比较。
在这里插入图片描述
上网找到java中字符串反转的形式

第一种就是转换成StringBuffer这种形式然后去调用这个reverse的方法

 // StringBuffer
  public static String reverse1(String str) {
    return new StringBuilder(str).reverse().toString();
  }

第二种利用 String 的 toCharArray 方法先将字符串转化为 char 类型数组,然后将各个字符进行重新拼接:

class Solution {
    public boolean isPalindrome(int x) {
        String y = ""+x;
        String reverse = "";
        char[] chars = y.toCharArray();
        for(int i =chars.length-1;i>=0;--i){
            reverse +=chars[i];
        }
        if(y.equals(reverse)){
            return true;
        }else{
            return false;
        }
    }
}
 public static String reverse2(String str) {
    char[] chars = str.toCharArray();
    String reverse = "";
    for (int i = chars.length - 1; i >= 0; i--) {
      reverse += chars[i];
    }
    return reverse;
  }

利用 String 的 CharAt 方法取出字符串中的各个字符:

 public static String reverse3(String str) {
    String reverse = "";
    int length = str.length();
    for (int i = 0; i < length; i++) {
      reverse = str.charAt(i) + reverse;
    }
    return reverse;
  }

官方解答
映入脑海的第一个想法是将数字转换为字符串,并检查字符串是否为回文。但是,这需要额外的非常量空间来创建问题描述中所不允许的字符串。

第二个想法是将数字本身反转,然后将反转后的数字与原始数字进行比较,如果它们是相同的,那么这个数字就是回文。
但是,如果反转后的数字大于 \text{int.MAX}int.MAX,我们将遇到整数溢出问题。

按照第二个想法,为了避免数字反转可能导致的溢出问题,为什么不考虑只反转 \text{int}int 数字的一半?毕竟,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。

例如,输入 1221,我们可以将数字 “1221” 的后半部分从 “21” 反转为 “12”,并将其与前半部分 “12” 进行比较,因为二者相同,我们得知数字 1221 是回文。

让我们看看如何将这个想法转化为一个算法。

class Solution {
    public boolean isPalindrome(int x) {
        if(x<0 || (x%10 == 0 && x !=0) ){
            return false;
        }
        int reverseNumber = 0;
        while(x > reverseNumber){
            reverseNumber = reverseNumber*10 + x%10;
            x /=10;
        }
        return x==reverseNumber || x ==reverseNumber/10;
    }
}

第一个if语句,判断如果x小于0那么肯定不是回文数,再判断一下x如果最后一位是0,这个数但不是0那么这个数也肯定不是回文数。

定义一个reverseNumber是最后返回的数字
reverse从最后开始对x取余,然后*10,直到这个数字比x大12021
就会变成x =12 reverNumber =120

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值