LeetCode(C++)刷题计划:9-回文数

9-回文数

@Author:CSU张扬
@Email:csuzhangyang@gmail.com or csuzhangyang@qq.com

1. 题目

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

示例 1:
输入: 121
输出: true

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number

2. 解法

2.1 解法一

  1. 我们将该数字翻转得到的数字和原数字相等,此时它就是回文数。

  2. 考虑翻转后会溢出的问题,我们设置翻转后的数字设置为long类型即可。

  3. 当然2中方法并不适用所有情况,我们可以使用以下方法判断.

    if (reverse > INT_MAX / 10 || (reverse >= INT_MAX && (temp % 10) > 7))
        return false;
    

执行用时: 4 ms, 在所有 cpp 提交中击败了99.52%的用户
内存消耗: 7.9 MB, 在所有 cpp 提交中击败了95.45%的用户

class Solution {
public:
    bool isPalindrome(int x) {
        if (x < 0)
            return false;
        int temp = x;
        long reverse = 0;
        while (temp) {
            reverse = reverse * 10 + temp % 10;
            temp = temp / 10;
        }
        return (reverse == x);
    }
};

2.2 解法二

  1. 我们没有必要将整个数字翻转,只需要将后一半数字反转,再与前一半的数字相比较即可。
  2. 例如1234321,后一半的数是321,翻转得到123,前一半的数是123,两者相等,则是回文数。
    需要注意奇回文数和偶回文数的处理。

执行用时: 16 ms, 在所有 cpp 提交中击败了75.83%的用户
内存消耗: 8.1 MB, 在所有 cpp 提交中击败了82.64%的用户

class Solution {
public:
    bool isPalindrome(int x) {
        int digit = 0;
        if (x < 0)
            return false;
        int temp = x;
        while (temp) {
            temp = temp /10;
            digit ++;
        }
        int left = 0, right = 0;
        left = x / pow(10, (digit + 1) / 2);
        for (auto i = 0; i < digit / 2; ++ i) {
            right = right * 10 + x % 10;
            x = x / 10;
        }
        return (left == right ? true : false);
    }
};
原文地址:https://www.cnblogs.com/MagicConch/p/12179161.html