领扣刷题 leetcode 09

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 就解决了这个问题

今天的我还是好菜啊!!

猜你喜欢

转载自www.cnblogs.com/WuLiaoTC/p/10323771.html