LeetCode专题-Python实现之第9题:Palindrome Number
相关代码已经上传到github:https://github.com/exploitht/leetcode-python
文中代码为了不动官网提供的初始几行代码内容,有一些不规范的地方,比如函数名大小写问题等等;更合理的代码实现参考我的github repo
1、读题
Determine whether an integer is a palindrome. Do this without extra space.
这一题描述很简单,判断一个数字是否是回文数,不要用额外的空间。其实我觉得逻辑不是那么简答,2个点需要注意,怎样的数字是回文数和怎样算不使用额外空间?
1、先考虑什么数字是回文数?
- 121是回文数
- 1221是回文数
- 1001是回文数
- 0-9都是回文数
- 负数都不是回文数
2、怎样理解不占用额外空间?
写代码肯定需要一定的内存空间,一点都不用就表示随意一个操作都可能违规。所以这里我理解的就是空间复杂度是O(1),也就是不管你给什么数字,我的算法占用空间恒定,而且不大。
写python的可能很容易想到把数字12345转换成序列类型然后反转判断反转前后是否相同来判断回文数,但是这样明显多出来了2个字符串对象,字符串和数字可不一样,字符串的基本单位是字符,字符才是和数字一个级别的,通俗讲数字12和1234占用空间一样,字符串12和1234差了约一半。也就是说我们可以操作数字本身,但是不能“投机取巧”空间换时间。
2、解题
怎样操作一个数字呢?判断回文数直接的想法是取首尾然后比较是否相等,相等则去掉首尾,继续比较下一个。
怎样取出最后一位呢?观察如下等式:
1234 % 10 = 4
1234 // 10 = 123
这样就分离出来了123和4
怎样取出第一位呢?
1234 // 1000 = 1
1000是1234的数量级
数量级可以通过1234 // 10 > 10; 1234 // 100 > 10; 1234 // 1000 < 10 来找到1000这个数字
这种算法涉及到寻找位数,更麻烦的是遇到1001这种回文数要做额外判断和处理,不然1001去掉首尾变成0了,虽然1001处理结果还算对的,但是10011这种就躲不过去了,去掉首尾得到1,明显逻辑错误了。鉴于这种实现比较low,这里不贴实现了。
略
3、第二种思路
题目的提示中说到反转一个整数,然后比较反转前后的数字,也可以判断回文数,只是需要注意反转可能导致溢出。既然反转是一个思路,又要考虑溢出问题,怎么办呢?观察数字:
123456789和123454321,需要处理的数字既然全反转可能会变大导致溢出,那么反转一半会怎样呢?
给定一个数字12344321如果处理成1234 1234,2个数字相等,那么就是回文数。
给定一个数字123454321如果处理成1234 12345,仅末尾不同,那么也是回文数。
需要注意的是0结尾的数字1210这种不单独处理容易被上面算法处理成回文数。
反转的思路和第二部分解题分析的类似,因为1234%10就能拿到最后一位
4 * 10 + 123 % 10就能拿到43,也就是后2位的反转结果,于是有了如下解法:
class Solution(object):
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
# 0-9是回文数
if 0 <= x <= 9:
return True
# 负数和0结尾的不是回文数
if x < 0 or x % 10 == 0:
return False
tmp = 0
while x > tmp:
tmp = tmp * 10 + x % 10
x = x / 10
if x == tmp or x == tmp / 10:
return True
else:
return False
LeetCode专题-Python实现之第9题:Palindrome Number的更多相关文章
- LeetCode专题-Python实现之第28题: Implement strStr()
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第27题:Remove Element
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第26题:Remove Duplicates from Sorted Array
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第21题:Merge Two Sorted Lists
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第20题:Valid Parentheses
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第14题:Longest Common Prefix
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第13题:Roman to Integer
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第7题:Reverse Integer
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- LeetCode专题-Python实现之第1题:Two Sum
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
随机推荐
- NOIP2013提高组 T2 火柴排队
一开始看也想不到这居然要用到逆序对,归并排序. 先来看看题目: 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间 ...
- 20181117-python第二章学习小结-part2
浮点型补充: 有限小数与无限循环小数,不包括无理数! 小数点后面的数据运算太复杂,精确度不及整数! 尽量使用科学计数表示小数 列表学习(语法) 创建:[] list = [] #创建空表 list ...
- Oracle在.sql文件中创建存储过程
创建存储过程的语法网上到处都有. 可我执行了半天都创建不成功. 最后,发现! 在最后加个 / 就可以了!!! 真坑啊 今天连续被Oracle坑了两次了. 最后,感谢这个人https://blog.cs ...
- CSS、常用标签属性
div的样式:[width:宽度 :100像素.height:高度100px.background:背景颜色红色] 内嵌的形式:用<style type="text/css>&l ...
- select2使用小结
做项目考虑到使用的便捷,要用到select2,就研究了一下,做个小结,防止忘记.本文内容是建立在NFine框架上的,使用的MVC三层架构.本人很少写文章,学习的知识也过少,不知道能不能表达准确,如有错 ...
- vue将指定区域的表格数据或element-ui中el-table的数据单笔或多笔批量导出excel
公司在后台管理系统开发中用到了 vue+element-ui 组合的框架,但随着需求的越来越复杂,前端的工作难度也呈几何倍数递增,工作量随之增大.这不,在项目中增加一个将列表数据导出为excel的需求 ...
- Redis安装及使用
1.我们可以通过在官网下载tar.gz的安装包,或者通过wget的方式下载 进入要下载到的文件夹: wget http://download.redis.io/releases/redis-4.0.1 ...
- spring的配置和使用
spring的配置和使用 1. 创建基于java的配置. 配置极少量的XML来启用java配置: <?xml version="1.0" encoding="U ...
- 高德Location
1.创建Demo,获取key 打开高德开发平台 → 我的应用 → 创建应用 → 创建新Key 说明: 1.发布版安全码获取:用自己的签名打包成apk安装软件,用SHA1工具查看 2.调试版安全码获取: ...
- QEMU KVM Libvirt(12): Live Migration
由于KVM的架构为 Libvirt –> qemu –> KVM 所以对于live migration有两种方式,一种是qemu + KVM自己的方式,一种是libvirt的方式,当然li ...