LeetCode_09 回文数【数学】

题目描述

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

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

示例

输入: 121
输出: true

输入: -121
输出: false

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

输入: 10
输出: false

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

知识点

  • 回文数
  • 数字反转(数学解法)
  • 整数转化为字符串

整数&字符串转化

  • string转int的方式:
    采用标准库中atoi函数。
string s = "12";
int a = atoi(s.c_str()); 
  • int转string
    采用标准库中的to_string函数。
int i = 12;
cout << std::to_string(i) << endl; 

解法

思路一 反转一半数组(数学解法)

说明:此题和第7题不同之处在于,7题需要完全反转整个数字,而本题只需要反转一半。
这样做的好处是:不用溢出检验。

算法流程

  • 1、处理一些临界情况
a.所有负数都不可能是回文,如-123
b.如果数字的最后一位是0,但他本身不是0的时候,因为不可能有0220,如:10
  • 2、将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于反转后的数字时,就意味着我们已经处理了一半位数的数字。
  • 3、比较反转一半的数字和剩下的原始数字,如果相等(例如1221),或者反转一半的数字/10==剩下的原始数字(例如:12321)

第3条的解释 给出的循环条件是剩下的原始数字x>反转后的数字rev,所以跳出循环的条件就是:

  1. x=rev
  2. x<rev

第一种情况,直接就是回文数;

例子:1221,x=12,rev=12,即为回文数

第二种情况,需要判断rev/10=x

例子:12321,x=12,rev=123,rev/10=12,即为回文数

代码

#include <iostream>
using namespace std;
class Solution {
public:
      bool isPalindrome(int x) {
        int rev = 0;//rev记载倒置后的数字
        //检验临界情况:负数不是回文数,末尾是0但不等于0的不是回文数
        if (x < 0||(x % 10 == 0 && x != 0)) return false;
        //原始数字x小于反转后的数字rev
        while (x>rev) {
            int pop = x % 10;//pop记录x的个位数
            x /= 10;//去掉个位数
            rev = rev * 10 + pop;//把pop记录的个位数赋值给temp
        }
        //比较得出是否是回文数
         return rev==x||rev/10==x;

    }
};

int main() {
    Solution solution;

    cout << solution.isPalindrome(-123) << endl;
    cout << solution.isPalindrome(10) << endl;
    cout << solution.isPalindrome(12321) << endl;
}

思路二 转化成字符串

参考链接
https://blog.csdn.net/single6/article/details/82318175

(未实践)

原文地址:https://www.cnblogs.com/zhuomoyixia/p/12397506.html

时间: 2024-11-05 21:50:18

LeetCode_09 回文数【数学】的相关文章

Leetcode_09【回文数】

文章目录: 题目 脚本一及注释 脚本一逻辑 题目: 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121输出: true示例 2: 输入: -121输出: false解释: 从左向右读, 为 -121 . 从右向左读, 为 121- .因此它不是一个回文数.示例 3: 输入: 10输出: false解释: 从右向左读, 为 01 .因此它不是一个回文数.进阶: 你能不将整数转为字符串来解决这个问题吗? 脚本一及注释:[用时52ms]

【数据结构与算法】数学——回文数

回文数 LeetCode:回文数 题目描述: 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例: 输入: 121 输出: true 思想: x%10得到尾数,x/d(d为10的x的位数次方)得到首位数字,比较二者是否相同: 注意:循环条件必须是x>0而不是x>10.当x为个位数时,如果是中心位置必然是true,但如果是1000021这种情况(不是回文数),x最后为2,此时x%10跟x/d不相等需要再判断一轮. 代码: class Solution

C语言之回文数算法

"回文"是指正读反读都能读通的句子.它是古今中外都有的一种修辞方式和文字游戏,如"我为人人,人人为我"等.在数学中也有这样一类数字有这种特征,成为回文数(palindrome number). 设n是一随意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.比如,若n=1234321,则称n为一回文数.但若n=1234567,则n不是回文数. 上代码: #include <stdio.h> #define true 1 #defin

(LeetCode)Palindrome Number -- 判断回文数

Determine whether an integer is a palindrome. Do this without extra space. 解题分析: 题目很简单,但是对于要求需要看清楚. Some hints: Could negative integers be palindromes? (ie, -1) If you are thinking of converting the integer to string, note the restriction of using ex

yzoi1109&amp;&amp;viojs1042最小步数的一点看法——回文数

Description - 问题描述 有一天,雄霸传授本人风神腿法第一式:捕风捉影..............的步法(弟子一:堂主,你大喘气呀.风:你给我闭嘴.)捕风捉影的关键是换气(换不好就会大喘气...). 使用捕风捉影这一招时并不是每一步都喘气,而是在特定的步数喘气.一般来说功力越高,喘气越稀疏.喘气的步数符合特定规律:第一要是SUSHU(弟子二:哇塞!堂主,你还会鸟语,我好好崇拜你呦!可是SUSHU是什么意思呢?风:笨蛋,那是汉语拼音!)第二要是一个回文数,回文数就是正反念一样的数,如:

LeetCode-9回文数

问题: 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121输出: true示例 2: 输入: -121输出: false解释: 从左向右读, 为 -121 . 从右向左读, 为 121- .因此它不是一个回文数.示例 3: 输入: 10输出: false解释: 从右向左读, 为 01 .因此它不是一个回文数.进阶: 你能不将整数转为字符串来解决这个问题吗 来源:力扣(LeetCode)链接:https://leetcode-cn.

判断一个数是否为回文数

#include <stdio.h> int is_palindromic(int num) {  char _old = num;  char _new = 0;  while (num)  {   _new = _new * 10 + (num % 10);   num = num / 10;  }  if (_new == _old)  {   return 1;  }  else  {   return 0;  } } int main() {  int num = 0;  scanf

LeetCode 9 Palindrome Number (回文数)

翻译 确定一个整数是否是回文数.不能使用额外的空间. 一些提示: 负数能不能是回文数呢?(比如,-1) 如果你想将整数转换成字符串,但要注意限制使用额外的空间. 你也可以考虑翻转一个整数. 然而,如果你已经解决了问题"翻转整数(译者注:LeetCode 第七题), 那么你应该知道翻转的整数可能会造成溢出. 你将如何处理这种情况? 这是一个解决该问题更通用的方法. 原文 Determine whether an integer is a palindrome. Do this without ex

要求循环输入一个数,判断是否为回文数

import java.util.Scanner; public class HuiWenShu { public static void main(String[] args) { Scanner input = new Scanner(System.in); char c = 'y'; //初始化c为y,为下面的循环做好准备 while(c == 'y'){ while(c == 'y'){ System.out.println("请随意输入一个大于三位的奇位数"); //回文数属