题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例:121 -> true,-121 -> false
题解
一、字符串的反转
1 | public boolean isPalindrome(int x) { |
二、数学:去首去尾,首尾比较
例:x = 12321
- 得到首位left: 12321 / 10000 = 1; (此处div=10000为计算得出)
- 得到末位right:12321 % 10 =1; (此处10为定值,用来取个位上的数)
- 若left=right,去首尾缩减,x -> 232 :(12321 % 10000) / 10 。即(x % div) / 10。
- x已缩减两位数-> div减小。div -> div / 100。
代码实现
1 | public boolean isPalindrome(int x) { |
思考:
若是121,10021第二次循环时x都为2。怎么判断的?
- 10021: 第二次循环时x=2,div=100 ->
left=2 / 100=0;right=2 % 10=2; -> left!=right -> return false - 121:第二次循环时x=2,div=1 -> left=2 /1 =2;right=2 % 10=2;x=(2 % 1) / 10=0 -> 结束循环 -> return true
三、巧妙数学-对折比较
取后半段,进行翻转 -> 就是取x个位数并组装rightPart> x不断缩减个位数
例x=12321,初始rightPart = 0;
- 取x的个位数lastNum = 12321 % 10 ->1;
- 将lastNum组装:rightPart = rightPart*10 + lastNum ->1;
- x缩减成->1232:x=x/10;
- 循环上面操作。直到x <= rightPart(此时说明已经对折到半或过半了)
思考:
- 若数字长度为奇数(如12321),rightPart(123)位数会比x最后值多一位。12!=123,但也应返回true -> 将rightPart去一位(12==123/10) -> x ==rightPart/10
- 若是70、7,最后x都为0,rightPart都为7。70->false,7->true;因此循环前若x个位是0 -> 直接返回false
代码实现
1 | public boolean isPalindrome(int x) { |
题目:力扣No.9-回文数