9.回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 示例 1:
- 输入: 121
- 输出: true
- 示例 2:
- 输入: -121
- 输出: false
- 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
- 示例 3:
- 输入: 10
- 输出: false
- 解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
昨天看题目的时候不小心看了一下官方的解释,所以相当于部分借鉴了官方解法...,但是好像还没是没有官方写的好.
下面是我自己的解法 顺便放上能完整运行的c程序
#include <stdio.h>
#include<stdbool.h>
bool isPalindrome(int x);
int main()
{
printf("%d", isPalindrome(-1));
printf("%d", isPalindrome(0));
printf("%d", isPalindrome(10));
printf("%d", isPalindrome(121));
printf("%d", isPalindrome(123321));
return 0;
}
bool isPalindrome(int x) {
/*(这里借鉴了官方,主要就是为了过滤参数,过滤的情况有 1.负数情况,这很显然不是回文数, 2. 末尾为0的情况(注意0必须排除,官方没有提醒我0也是回文数....其实是我自己傻)*/
if(x<0||(x%10==0&&x!=0))
return false;
int left=x;
int right=0;/*这两个参数的含义是x的左半部分和右半部分*/
while(left>right){
right=right*10+left%10;
if(left==right){
return true;
}
left=left/10;
}
if(left==right){
return true;
}
return false;
}
我来解释一下上面那个while循环里的内容
首先,跳出条件是left<=right,即左边大于右边
比如 12361 当读取到中间的时候 left=12 right=163 即左边比右边低一位(x为奇数) 或者 相同位数的时候跳出(x为偶数)
right=right*10+left%10这个没什么好解释的,就是右边又多了一位
接下来必须判断一次 left==right 因为当x为单数时 比如x=121,left=12 right=12 是应该返回true的,没有办法很好的解决这个问题,所以需要增加一次判断
接下来摆官解
bool isPalindrome(int x) {
if(x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int revertedNumber = 0;
while(x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
return x == revertedNumber || x == revertedNumber/10;
}
首先 第一个判断没什么好解释的,和我的一样(我和他一样才对)
哇,官解的写好和我好像,他好像能够避免 while循环内的判断
让我看看他是怎么做到的
他在返回时增加了一个x == revertedNumber/10 很好的解决了这个问题...我没想到
举个例子 x=121,退出循环时 left(x)=1 right(revertedNumber)=12 就解决了这个问题
今天的我还是好菜啊!!
原文地址:https://www.cnblogs.com/WuLiaoTC/p/10323771.html
时间: 2024-11-03 05:53:07