9.回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
一、转字符串
我上来就是一个转字符串,很快啊,面试官:你回去等通知吧,下一位。
class Solution { public boolean isPalindrome(int x) { String s = String.valueOf(x); int left = 0; int right = s.length() - 1; while (left < right) { if (s.charAt(left) != s.charAt(right)) { return false; } left++; right--; } return true; } }
二、数学
使用数学方法解决这个问题,也可以用反转字符串的思路,反转数字就可以了啊,比如321123,反转后是321123相等,是回文数,但是需要比较的只要一半,而且反转后可能出现整数溢出的问题,所以可以优化为反转后一半,和前一半做比较,123反转后是321,和321123前三位比较相等。
那么问题就转化为如何得到一个数字的后一半并且反转它,同时得到该数字的前一半。
首先我们处理几个边界问题,负数必然不是回文数,最后一位为0也必然不是,直接false。
众所周知,取出一个数字每一位,对10取余然后除以10就行(刚接触编程时老师就讲过的),有这个知识就很简单了,比如321123,对10取余得到3,然后除以10得到32112,假设reverse = 3,得到3,然后再对32112取余得到2,此时reverse = reverse * 10 + 2得到32,继续下去,会得到321,直到前半部分数字小于等于后半部分就结束,如何理解呢,当这个数字是偶数位时,前半和后半位数肯定相等,假如是奇数,那么取到后半多前半一位,比较的时候去掉后半部分最后一位就可以了。
class Solution { public boolean isPalindrome(int x) { if (x < 0 || (x % 10 == 0 && x != 0)) { return false; } int reverse = 0; while (x > reverse) { reverse = reverse * 10 + x % 10; x /= 10; } return x == reverse || x == reverse / 10; } }
原文:https://leetcode.cn/problems/palindrome-number/solution/by-nice-hermann9a2-6lkv/