判断一个整数是否是回文数C++实现 leetcode系列(九)

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

示例 1:

输入: 121
输出: true

示例 2:

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

示例 3:

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

这道验证回文数字的题如果将数字转为字符串,就变成了验证回文字符串的题,没啥难度了,我们就直接来做follow up吧,不能转为字符串,而是直接对整数进行操作,我们可以利用取整和取余来获得我们想要的数字,比如 1221 这个数字,如果 计算 1221 / 1000, 则可得首位1, 如果 1221 % 10, 则可得到末尾1,进行比较,然后把中间的22取出继续比较。代码如下:

解法一:

class Solution {
public:
    bool isPalindrome(int x) {
        if (x < 0) return false;
        int div = 1;
        while (x / div >= 10) div *= 10;
        while (x > 0) {
            int left = x / div;
            int right = x % 10;
            if (left != right) return false;
            x = (x % div) / 10;
            div /= 100;
        }
        return true;
    }
};

我们再来看一种很巧妙的解法,还是首先判断x是否为负数,这里我们可以用一个小trick,因为我们知道整数的最高位不能是0,所以回文数的最低位也不能为0,数字0除外,所以如果发现某个正数的末尾是0了,也直接返回false即可。好,下面来看具体解法,要验证回文数,那么就需要看前后半段是否对称,如果把后半段翻转一下,就看和前半段是否相等就行了。所以我们的做法就是取出后半段数字,进行翻转,具体做法是,每次通过对10取余,取出最低位的数字,然后加到取出数的末尾,就是将revertNum乘以10,再加上这个余数,这样我们的翻转也就同时完成了,每取一个最低位数字,x都要自除以10。这样当revertNum大于等于x的时候循环停止。由于回文数的位数可奇可偶,如果是偶数的话,那么revertNum就应该和x相等了;如果是奇数的话,那么最中间的数字就在revertNum的最低位上了,我们除以10以后应该和x是相等的,参见代码如下:

解法二:

class Solution {
public:
    bool isPalindrome(int x) {
        if (x < 0 || (x % 10 == 0 && x != 0)) return false;
        int revertNum = 0;
        while (x > revertNum) {
            revertNum = revertNum * 10 + x % 10;
            x /= 10;
        }
        return x == revertNum || x == revertNum / 10;
    }
};

下面这种解法由网友zeeng提供,如果是palindrome,反转后仍是原数字,就不可能溢出,只要溢出一定不是palindrome返回false就行。可以参考Reverse Integer这题, 直接调用Reverse()。

解法三:

class Solution {
public:
    bool isPalindrome(int x) {
        if (x < 0 || (x % 10 == 0 && x != 0)) return false;
        return reverse(x) == x;
    }
    int reverse(int x) {
        int res = 0;
        while (x != 0) {
            if (res > INT_MAX / 10) return -1;
            res = res * 10 + x % 10;
            x /= 10;
        }
        return res;
    }
};

原文地址:https://www.cnblogs.com/suibian1/p/10952965.html

时间: 2024-10-09 12:15:59

判断一个整数是否是回文数C++实现 leetcode系列(九)的相关文章

判断一个整数是否为回文数 Check if a number is palindrome

一种方法是先翻转当前数,然后把它和原数比较(略) 另一种是递归方法,借用一个复制数,对原数递归,使之翻转,然后配合复制数比较 package recursion; public class Check_if_a_number_is_palindrome { public static void main(String[] args) { int num = 121321; System.out.println(check(num)); num = 12321; System.out.printl

leetcode_判断一个整数是否是回文数C++

小弟不才,有错误之处,麻烦指出.谢谢. 判断一个数是否是回文数. 方法一:主要思路是把原本的数字(x)拆分开,组成一个数字(y),然后判断x==y. class Solution { public: bool isPalindrome(int x) { int i=0; int j=0; int k=0; if (x < 0) {//判断负数 return false; } if(x>=0&&x<10){//2,3,5,等都是回文数 return true; } else

编写一个函数判断一个整数是否为回文数。如果一个属从正的方向读和从反的方向读的结果相同,则该数就是回文数。

bool palindrome(int b){ int k = 0; char a[1000]; do { int c; c = b % 10; char d; for (int i = 0; i <= 9; i++) { if (c == i) { d = '0' + i; break; } } a[k++] = d; b = b / 10; } while (b != 0); // k = 字符长度 int j = 0; if (k == 1) { return true; } else {

c语言求字符串中大写字母个数,单词个数,子串个数及一个整数是否为回文数

#include <stdio.h> #include <ctype.h> #pragma mark 统计从终端输入的字符中每个大写字母的个数.用#号作为输入结束标志 int main() { int num[26] = {0}, i; char c; while ((c = getchar())!='#') { if (isupper(c)) { num[c-65]++; } } for (int i = 0; i<26; i++) { if (num[i]) { prin

判断一个数字是否为回文数

Determine whether an integer is a palindrome. Do this without extra space.(source) 判断一个数字是否为回文数,并且不使用额外的存储空间. "回文"是指正读反读都能读通的句子,那么回文数,就很容易理解,就是指一个数正反读的值是相同的.还有一个要求是不要使用额外的存储空间. Hints: 要将一个数的最高位与最低位比较,取出一个数的最低位容易(x%10),但要得到高位却很难. Solution 1: 首先得知

C实例--判断一个字符串是否是回文数

回文是指顺读和反读内容均相同的字符串,例如"121","ABBA","X"等.本实例将编写函数判断字符串是否是回文. 引入两个指针变量,开始时,两个指针分别指向字符串的首末字符,当两个指针所指字符相等时,两个指针分别向后和向前移动一个字符位置,并继续比较,直到两个指针相遇,说明该字符串是回文,如果比较过程中发现两个指针指向的字符不相等,则判断该字符串不是回文. 下面是代码的实现部分: #include <stdio.h> #inclu

判断一个字符串是否为回文数字符串

#include<stdio.h> #define STRLEN 100 int Is_palindromic_str(char *str) { int left = 0;//字符串数组的第一个字母的下标 int i = 0; while(str[i] != '\0') { i++; } int right = i - 1;//字符串数组最后一个字母(非'\0')的下标 while(left <= right) { if(str[left] == str[right])//判断左右字符是

c语言练习3——判断一个5位数是否回文数

#include<stdio.h> #include<stdlib.h> /*题目:判断一个五位数是否为回民数.*/ int main(){ int a,a1,a2,a3,a4,a5; while(1){ printf("请输入一个5位数:"); scanf("%d",&a); a1=a%10; a2=a/10%10; a3=a/100%10; a4=a/1000%10; a5=a/10000; if(a1==a5&&

判断一个整数是否是回文

回文指第一个字符和最后一个字符相同,第二个字符与倒数第二个字符相同,以此类推.回文可以是“1221”的形式,也可以是“121”的形式:单个数字也是回文.这里定义负整数不是回文. 第一种做法是把正整数转换成字符串,存储在数组中,分别从左向右和从右向左遍历数组,判断是否是回文.这种方法的缺点是需要使用额外的存储空间. 第二种做法是从个位数开始,依次取出来每一个数,计算逆序后的整数是否与原整数相等.这种做法可能会有溢出的情况发生.为什么?:) 第三种做法是取出首尾数字比较是否相同,如果相同,去掉首尾数