LeetCode小白菜笔记[3]:Palindrome Number

9. Palindrome Number [Easy]

题目:Determine whether an integer is a palindrome. Do this without extra space.

click to show spoilers.
Some hints:
Could negative integers be palindromes? (ie, -1)
If you are thinking of converting the integer to string, note the restriction of using extra space.
You could also try reversing an integer. However, if you have solved the problem “Reverse Integer”, you know that the reversed integer might overflow. How would you handle such case?
There is a more generic way of solving this problem.

首先,负数直接判False,另外,整数的首位数字不能是0,故尾数为0的直接判False,当然0本身是一个trivial的回文数。
下面对于普遍的情况进行判断,最先想到的直接的方法就是每一位和对应的高位数字比较,如果有不一样,return False,否则判True。代码如下:

class Solution(object):def isPalindrome(self, x):""":type x: int:rtype: bool"""if (x<0 or (x % 10 == 0 and not x == 0)): # tackle trivial onesreturn Falselength = 1while(not x % (10 ** length)==0):length = length + 1for i in range( length // 2 ):if (not x // (10 ** i) % 10 == x // (10 ** (length-1-i)) % 10):return Falsereturn True

结果不出意外的G了G。。。

超时了。。。目测是太多乘幂运算了,占用了很多时间,而且每次取一位比较,这样的取法也是不太科学,很暴力。因此考虑其他的思路。翻转后再比较是一个可行的思路,但是会有overflow问题。考虑到实际上比较回文并不一定需要完全翻转和原数比较,可以翻转后一半和前面一半比较。这样可以避免溢出。代码如下:

class Solution(object):def isPalindrome(self, x):""":type x: int:rtype: bool"""if (x<0 or (x % 10 == 0 and not x == 0)): # tackle trivial onesreturn Falselength = 1while(not x % (10 ** length) == 0):length = length + 1length = length // 2half_reversed = 0for i in range(length):half_reversed = half_reversed * 10 + x % 10x = x // 10return (x == half_reversed or x // 10 == half_reversed)

鹅毛妈妈么么萌。。。还是 time limit exceeded,看来这个求length,即位数长度的这个乘幂也不能要。那该怎么判断是否到了中点呢?考虑长度为单数和双数的回文,如1235321,和124421,我们希望翻转成1235 123以及 124 124,如果从低到高,到了中点后再继续翻转一位,那么,123 1235,以及12 1244,翻转的一半会比前面的长,由于我们已经将尾数为0的直接判False了,所以位数长一定数值要大,所以可以用翻转后的大于剩下的部分作为退出循环的条件。试一试:

class Solution(object):def isPalindrome(self, x):""":type x: int:rtype: bool"""if (x<0 or (x % 10 == 0 and not x == 0)): # tackle trivial onesreturn Falsehalf_reversed = 0while(x > half_reversed): half_reversed = half_reversed * 10 + x % 10x = x // 10return (x == half_reversed or x == half_reversed // 10)

这个while的判别条件用的剩下的大于翻转的,这样如果是124 124,那么就不进去,而1235 123 最后一次进去,变成123 1235,因此half_reversed要除以10和剩余的比较。

终于通过了。。。

总结
注意每次应用之前循环的结果,每一位模和取位数这样的操作应避免,因为涉及到乘幂。感觉貌似理解起来简单而且写起来很直接的代码往往都run不过……
注意关注输入本身特性。

THE END

星期日, 10. 十二月 2017 06:40下午

LeetCode小白菜笔记[3]:Palindrome Number相关推荐

  1. LeetCode小白菜笔记[1]:Two Sum

    LeetCode小白菜笔记[1]:Two Sum 1. Two Sum [Easy] 题目: Given an array of integers, return indices of the two ...

  2. LeetCode小白菜笔记[17]:Sqrt(x)

    LeetCode小白菜笔记[17]:Sqrt(x) 69. Sqrt(x) [easy] Implement int sqrt(int x). Compute and return the squar ...

  3. 【leetcode❤python】 9. Palindrome Number

    #回文数 #Method1:将整数转置和原数比较,一样就是回文数:负数不是回文数 #这里反转整数时不需要考虑溢出,但不代表如果是C/C++等语言也不需要考虑 class Solution(object ...

  4. LeetCode(9)Palindrome Number

    题目如下: Python代码: def isPalindrome(self, x):""":type x: int:rtype: bool""&quo ...

  5. 【整数转字符串】LeetCode 9. Palindrome Number

    LeetCode 9. Palindrome Number Solution1: 不利用字符串 class Solution { public:bool isPalindrome(int x) {if ...

  6. 【回文串2】LeetCode 9. Palindrome Number

    LeetCode 9. Palindrome Number Solution1:我的答案 思路一:转化为字符串 class Solution { public:bool isPalindrome(in ...

  7. js 数组倒序_我用JS刷LeetCode | Day 6 | Palindrome Number

    来公众号「九零后重庆崽儿」,我们一起学前端 回文数: 说明:现阶段的解题暂未考虑复杂度问题 首发地址: 我用JS刷LeetCode | Day 6 | Palindrome Number​www.br ...

  8. 9. Palindrome Number*

    9. Palindrome Number* https://leetcode.com/problems/palindrome-number/description/ 题目描述 Determine wh ...

  9. LeetCode 287. Find the Duplicate Number (时间复杂度O(n)) + 链表判断环

    LeetCode 287. Find the Duplicate Number 暴力解法 时间 O(nlog(n)),空间O(n),按题目中Note"只用O(1)的空间",照理是过 ...

最新文章

  1. Linux高可用集群(Corosync+Pacemaker)
  2. 关于visualizer的setEnabled()方法何时进行设置成false?
  3. 使用数字万用表判断三极管管脚!
  4. XamarinAndroid组件教程设置动画的设置插值器
  5. Android调焦函数,高通Android驱动中的对焦马达的配置
  6. mysql基础(一) 编译安装mysql5.5
  7. 上位机多个下位机modbustcp通讯_【C#上位机】西门子1200PLC实用定位控制程序案例...
  8. python3数学函数
  9. hibernate总结-N+1问题
  10. win10系统excel2019单元格显示完整的年月日时分秒设置方法
  11. 笔试面试收获(持续更新中)
  12. lucene 各个版本介绍
  13. Linus Torvalds 不担心微软将控制 Linux
  14. Typora使用技巧--不定期更新
  15. pycharm+opencv安装总结
  16. 软素质面试题分享以及一些面试技巧和面试礼仪
  17. c语言硬币个数最小值,c语言 PTA day4 将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?...
  18. 解决Chrome浏览器登录web系统一直报“验证码错误问题“
  19. python与金融风险管理_怎么学习金融风险管理?
  20. 关闭 自带日志_再也不是样子货! 丰田86改装日志(3)

热门文章

  1. 单机部署多个 nginx
  2. 安装软件时出现System Pending Reboot
  3. 关于GetDlgItem、GetDlgCtrlID
  4. ceiling 和 floor 函数
  5. 【路径规划】基于果蝇优化算法实现机器人路径规划matlab源码
  6. 微软 Build 2022 开发者大会于 5 月 24 日至 27 日举行
  7. Swift 3 :基于 AVAudioPlayer 的简单音乐播放器
  8. 优秀平面设计的广告思维是如何训练的
  9. 鼠标右键添加powershell和CMD
  10. Runtime error