导航页-LeetCode专题-Python实现

相关代码已经上传到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的更多相关文章

  1. LeetCode专题-Python实现之第28题: Implement strStr()

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  2. LeetCode专题-Python实现之第27题:Remove Element

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  3. LeetCode专题-Python实现之第26题:Remove Duplicates from Sorted Array

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  4. LeetCode专题-Python实现之第21题:Merge Two Sorted Lists

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  5. LeetCode专题-Python实现之第20题:Valid Parentheses

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  6. LeetCode专题-Python实现之第14题:Longest Common Prefix

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  7. LeetCode专题-Python实现之第13题:Roman to Integer

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  8. LeetCode专题-Python实现之第7题:Reverse Integer

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  9. LeetCode专题-Python实现之第1题:Two Sum

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

随机推荐

  1. [Tips]vim设置

    临时设置 在vim中输入 :set nu! 若显示行号时,它的功能时取消行号:若不显示行号时,它的功能是显示行号. 固定设置 在~/.vimrc中进行设置. 添加注释: 双引号是注释 ” this i ...

  2. myeclipse中的HTML页面在浏览器中显示为乱码

    myeclipse中的HTML页面在浏览器中显示为乱码 在通过myeclipse开发项目的过程中,如果用HTML页面书写前端,可能出现中文乱码现象,需要怎么解决呢?下面是我从网上搜的方法: 解决办法: ...

  3. Autograd:自动微分

    Autograd 1.深度学习的算法本质上是通过反向传播求导数,Pytorch的Autograd模块实现了此功能:在Tensor上的所有操作,Autograd都能为他们自动提供微分,避免手动计算导数的 ...

  4. over(partition by..) 的运用(转)

    oracle的分析函数over 及开窗函数一:分析函数overOracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每 ...

  5. RabbitMQ 官方demo1

    public class RabbitMqSend { public static void Test() { var factory = new ConnectionFactory() { Host ...

  6. position属性sticky和fixed的区别比较

    position属性之fixed fixed总是以body为定位时的对象,总是根据浏览器窗口来进行元素的定位,通过left,right,top,bottom属性进行定位. <!DOCTYPE h ...

  7. Java_流程控制

    介绍: java的流程控制结构有三种:顺序.选择.循环            顺序结构,就是从头到尾依次执行每条语句的操作. 选择结构,也称条件控制,是指根据表达式的值有选择的执行. 循环结构,也称回 ...

  8. javascript 编程风格 部分精要

    1 换行保持两个缩进(通常是一行太长) 运算符前后加一个空格,包括赋值运算符和逻辑运算符 括号运算符,左括号之后,右括号之前不应该有空格 段代码无关,添加空行 命名驼峰式,一般首字母小写,其他单词首字 ...

  9. java从pdf中提取文本

    一(单文件转换):下载pdfbox包,百度搜pdfbox.(fontbox-1.8.16.jar和pdfbox-app-1.8.16.jar) package pdf; import java.io. ...

  10. scala 下 sigmoid 与breeze.numeric.sigmoid差异对比

    scala> val beforeInit = System.nanoTime;val handsgn = rd.map(x => 1.0 / (1.0 + Math.exp(-x))); ...