leetcode回文数题解

题目描述

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121
输出: true

示例 2:

输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

进阶:
你能不将整数转为字符串来解决这个问题吗?

解题思路

一、判断正负

根据题意负数必不是回文数,故直接返回false
若为正数,则开始处理

二、正数处理

判断正读反读都一样,我首先想到的是依次取出该数的高位(high_num)和低位(low_num)进行比较
以 12321 为例 先得到数的位数备用,该数位数x_num = 5
1.先取最高位和最低位:low_num = x % 10 / 1 = 1; high_num = x / 10000[10 ^ (5-1)] % 10 = 1,相等

------ 12321 % 10 / 1 = 1 == 12321 / 10000 % 10 = 1

2.次高位和次低位:low_num = x % 100 / 10 = 2;high_num = x / 1000[10 ^ (4-1)] % 10 = 1,相等

------12321 % 100 / 10 = 2 == 12321 / 1000 % 10 = 2

3.发现不需要再判断,该数是回文数,返回true

三、发现处理时的规律

整个处理过程类似一个二分法一样的循环,可以发现结束条件时x模的那个数(mod_num)大于了x除的数 (div_num)
而每次循环mod_num会乘10,div_num会除10
式中还有两个变量分别是:
为了取出低位而除的数(low_div),该数每次循环后乘10,以便于下次循环可以取下一位低位
为了取出高位而模的数(high_mod),该数再循环中一直为10,因为每次比较都是取高位数的个位,故不 需要改变

代码部分

class Solution {
public:
    bool isPalindrome(int x) {
        if (x < 0) return false;

        int low_div = 1, high_mod = 10, x_num = 0, mod_num = 10, div_num;

        for (int t =x; t != 0; x_num++) t /= 10;
        div_num = pow(10, x_num-1);

        while (mod_num <= div_num) 
        {
            if ((x % mod_num) / low_div == (x / div_num) % high_mod) 
            {
                mod_num *= 10;
                low_div *= 10;
                div_num /= 10;
            }
            else return false;
        }

        return true;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值