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

示例 1:

输入: 121
输出: true

示例 2:

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

示例 3:

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

进阶:

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

解决方案


方法:反转一半数字

思路

映入脑海的第一个想法是将数字转换为字符串,并检查字符串是否为回文。但是,这需要额外的非常量空间来创建问题描述中所不允许的字符串。

第二个想法是将数字本身反转,然后将反转后的数字与原始数字进行比较,如果它们是相同的,那么这个数字就是回文。 但是,如果反转后的数字大于 int.MAX\text{int.MAX}int.MAX,我们将遇到整数溢出问题。

按照第二个想法,为了避免数字反转可能导致的溢出问题,为什么不考虑只反转 int\text{int}int 数字的一半?毕竟,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。

例如,输入 1221,我们可以将数字“1221”的后半部分从“21”反转为“12”,并将其与前半部分“12”进行比较,因为二者相同,我们得知数字 1221 是回文。

让我们看看如何将这个想法转化为一个算法。

算法

首先,我们应该处理一些临界情况。所有负数都不可能是回文,例如:-123 不是回文,因为 - 不等于 3。所以我们可以对所有负数返回 false。

现在,让我们来考虑如何反转后半部分的数字。 对于数字 1221,如果执行 1221 % 10,我们将得到最后一位数字 1,要得到倒数第二位数字,我们可以先通过除以 10 把最后一位数字从 1221 中移除,1221 / 10 = 122,再求出上一步结果除以10的余数,122 % 10 = 2,就可以得到倒数第二位数字。如果我们把最后一位数字乘以10,再加上倒数第二位数字,1 * 10 + 2 = 12,就得到了我们想要的反转后的数字。 如果继续这个过程,我们将得到更多位数的反转数字。

现在的问题是,我们如何知道反转数字的位数已经达到原始数字位数的一半?

我们将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于反转后的数字时,就意味着我们已经处理了一半位数的数字。

复杂度分析

  • 时间复杂度:O(log10(n))O(\log_{10}(n))O(log​10​​(n)), 对于每次迭代,我们会将输入除以10,因此时间复杂度为 O(log10(n))O(\log_{10}(n))O(log​10​​(n))。
  • 空间复杂度:O(1)O(1)O(1)。
public class Solution {public boolean isPalindrome(int x) {if (x < 0){return false;}int div = 1;while (x / div >= 10) {div = 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;}
}

LeetCode 9. 回文数 Palindrome Number相关推荐

  1. Leetcode 9. 回文数(Palindrome Number)

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...

  2. LeetCode第9题 回文数(Palindrome Number)

    文章目录 题目地址 题目描述 代码实现 解法一:普通解法 解法二:进阶解法---数学解法 解法三:进阶解法---巧妙解法 题目地址 题目地址https://leetcode-cn.com/proble ...

  3. C语言判断一个数是否是回文数Palindrome算法(附完整源码)

    判断回文数Palindrome的算法 判断回文数Palindrome的算法完整源码(定义,实现,main函数测试) 判断回文数Palindrome的算法完整源码(定义,实现,main函数测试) #in ...

  4. C++判断一个数是否为回文数palindrome的算法(附完整源码)

    C++判断一个数是否为回文数palindrome的算法 C++判断一个数是否为回文数palindrome的算法完整源码(定义,实现,main函数测试) C++判断一个数是否为回文数palindrome ...

  5. [模拟|数位] leetcode 9 回文数

    [模拟|数位] leetcode 9 回文数 1.题目 题目链接 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true ...

  6. 【LeetCode】回文数

    个人博客:https://jacob.org.cn package leetcode.editor.cn;//判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. ...

  7. LeetCode 9. 回文数

    文章目录 1. 题目信息 2. 解题 1. 题目信息 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1:输入: 121 输出: true 示例 2:输 ...

  8. leetcode isPalindrome (回文数判断)

    回文很简单,就是正着读和反着读一样,要判断一个数是否为回文数只需要判断正反两个是不是相等即可. 再往深了想一下,只需要判断从中间分开的两个数一个正读,一个反读相等即可. 代码: class Solut ...

  9. 20200119:(leetcode)回文数(3种解法)

    回文数 题目 基本思路 代码实现 题目 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -1 ...

最新文章

  1. Android AOSP 单独编译某一模块
  2. 怎么不让html网页自动跳转,javascript怎么禁止跳转页面?
  3. python工具是什么-python有什么好用的持续集成工具么?
  4. SharePoint2010沙盒解决方案基础开发——开发webpart读取绑定列表数据,并以一定的格式显示(加css样式)...
  5. 根据redis自增生成全局唯一订单id
  6. idea2021如何开启RunDashboard
  7. malloc分配内存的原理?
  8. Metronic学习之路
  9. 前端学习(1358) :渲染模板默认
  10. Azkaban业务流程如何转化为DataWorks业务流程
  11. VS2010 + OpenCL 1.1 @ Windows 7 + AMD HD6870
  12. Ubuntu20.04安装ROS Noetic
  13. Adblock Plus无法屏蔽CSDN右下角广告解决
  14. 什么专业的会学python语言_为什么要学习Python编程语言?哪些人适合学习Python?...
  15. 电脑蓝牙连接android程序,win7系统下电脑与Android手机蓝牙连接方法
  16. python实现——处理Excel表格(超详细)
  17. built a JNCIS LAB系列:Chapter 1 Autonomous System Paths v1.0
  18. python 爬虫论_python爬虫——论抓包的正确姿势和学好Javascript的重要性(1)
  19. 海康威视OCR/表格识别开源
  20. 用户输入一个列表和两个整数作为下标,然后使用切片获取并输出列表中结余两个下标之间的元素组成的子列表。例如,用户输入 [1,2,3,4,5,6]和2,5,程序输出[3,4,5]。

热门文章

  1. 如何在网页端登录企业邮箱修改密码?
  2. python入门小项目 | 开发一个《小猫抓鱼》小游戏
  3. C#游戏跨服架构进化之路
  4. excel VLOOKUP查找
  5. char *const 和 const char *(char const*)
  6. 蒲公英内测分发平台使用体验
  7. 几种典型的立体匹配算法
  8. 论文写作总结(中外文对比)
  9. 对比学习顶会论文系列-3-2
  10. 数据库的视图,视图的更新,视图的可操作性