[没事练练][Leetcode-9]Palindrome Number

 

题目要求

Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
链接:https://leetcode-cn.com/problems/palindrome-number

示例

Input: 121 Output: true

Input: -121 Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.

Input: 10 Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.

题解思路

1.比较直观想到的就是转换成字符串做反转操作。
2.题设建议是不要用转换字符串的方式去做,那么我想到的思路是先考虑一些边界情况,这个数是负数的情况。去掉一些边界情况,将整个数进行反转,如果反转后的数字和原始数字相同,那么这个数字就是回文。例如,输入 1221,我们可以将数字 1221,整个反转为1221,并对两个数字进行比较,如果相同的话,就是回文。

这个逆转的操作,对于数字1221,可以首先执行1221%10的操作得到1,然后要得到倒数第二个数字,可以将1221除以10,再求余数得到,同时将最后一位数字乘以10再加上倒数第二位的数字,那么就是1*10+2 = 12,就得到了想要的结果,以此类推,就得到了逆转后的数字了。

首先是前面第一和第二种的解法

java版本

1// 直接字符串反转求解
2class Solution {
3    public boolean isPalindrome(int x) {
4        String result = new StringBuilder(x + "").reverse().toString();
5        return result.equals(String.valueOf(x));
6
7    }
8}
file
 1class Solution {
 2    public boolean isPalindrome(int x) {
 3        if (x < 0 ) {
 4            return false;
 5        }
 6        int originX = x;
 7        int reverseNum = 0;
 8        while(x != 0) {
 9            reverseNum = reverseNum * 10 + x %10;
10            x = x/ 10;
11        }
12
13        return originX == reverseNum;
14    }
15}

file

官方还给了一种题解
官方给的题解是只需要求一半的数字即可,比如说1221,那么求到下半部分12,发现和上半部分12相等,即可退出,比如说12321,那么求到下半部分123,发现比12大,那么就退出,如果是非回文,那么只要下半部数比上半部数大时即可退出循环。

不过我感觉官方给的题解,不是很好理解,但是他这边考虑了可能完全逆转会有溢出的问题,从时间效率上来说和第二种差别不大。

 1class Solution {
 2    public boolean isPalindrome(int x) {
 3        if (x < 0 ) {
 4            return false;
 5        }
 6
 7        if (x % 10 ==0 && x!=0) {
 8            return false;
 9        }
10
11        int reverseNum = 0;
12        while(x > reverseNum) {
13            reverseNum = reverseNum * 10 + x %10;
14            x = x/ 10;
15        }
16
17        return x == reverseNum || x == reverseNum/10;
18    }
19}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值