博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode 007-009
阅读量:7055 次
发布时间:2019-06-28

本文共 2149 字,大约阅读时间需要 7 分钟。

这次的三道题都不是很难,属于那种一眼就能看出思路,只是方法是否最优的问题。说实话,这三道题更应该用C/C++来做,因为考察的都是字符串的基本功。不过我很久没用C系语言了,一时半会实在搞不定这个指针。大python嘛,无脑过就行了。所以这次我更侧重python如何用更少的代码量,更简洁的方式解决这些问题。当然,虽然python很好用,但用的时候一定要搞清楚它的性能瓶颈,这样子遇到问题才知道怎么解决,就比如第八题我所用的正则。

leetcode 007

74581788.jpg

92226833.jpg

代码实现

这道题要是用C/C++,最佳做法不是用指针一个个读,而是利用十位制的一些性质。用python就很无脑了。

class Solution:    def reverse(self, x):        """        :type x: int        :rtype: int        """        s = str(abs(x))[::-1]        result = int(s) if x > 0 else -int(s)        if result < -2**31 or result >= 2**31:            result = 0        return result

说实话,因为python语言设定的,这道题要用C的那种做法相当麻烦。正是因为这样,我深刻理解了,一门语言就该干它擅长的活,python就应该写得飘起来,而不是像C一样斤斤计较。

class Solution:    def reverse(self, x):        """        :type x: int        :rtype: int        """        maxint = 2**31        rev = 0        while x:            if x > 0:                x, pop = x // 10, x % 10            else:                x, pop = -(abs(x)//10) , -(abs(x) % 10)            if rev > maxint // 10 or (rev == maxint // 10 and pop > 7):                return 0            if rev < -(maxint // 10) or (rev == -(maxint // 10) and pop < -8):                return 0            rev = rev * 10 + pop        return rev

leetcode 008

84634828.jpg

57595871.jpg

代码实现

这道题要是中规中矩按照题目原设定的做法去做,要卡好几次边界。对于这类匹配问题,我一下子就想到了正则匹配。这道题用正则匹配就很无脑了。

class Solution:    def myAtoi(self, str):        """        :type str: str        :rtype: int        """        import re        try:            str = str.strip()            pos = re.match(r'^([-+]?)(\d)+', str).span()            ret = int(str[pos[0]:pos[1]])            if ret >= 2**31:                return 2**31-1            elif ret < -2**31:                return -2**31            return ret        except:            return 0

但是正则匹配有一个,那就是写匹配时要慎用贪婪匹配!不然会产生严重的性能问题,不过在这道题上还好,性能降得不是特别厉害。

leetcode 009

55774857.jpg

89905194.jpg

代码实现

属于回文串问题。代码 x = ' '.join(list(str(x))) 是在每两个字符插入空格,在本题中多余,但用来处理大多数回文串问题都非常高效。

class Solution:    def isPalindrome(self, x):        """        :type x: int        :rtype: bool        """        x = ' '.join(list(str(x)))        rev_x = x[::-1]        if x == rev_x:            return True        else:            return False

转载于:https://www.cnblogs.com/ChanWunsam/p/10241683.html

你可能感兴趣的文章
MySQL日期与时间戳互转函数
查看>>
图像的二维卷积实现
查看>>
【转载】TypeScript学习笔记——var与let
查看>>
Uninstall from GAC In C# code
查看>>
脚本适用场合
查看>>
xml的sax解析方法
查看>>
咏南开发框架之既支持2层又支持3层开发
查看>>
博客堂Blog开张
查看>>
获得当前时间
查看>>
Spring与web MVC的整合——Spring的应用上下文管理
查看>>
程序员的编辑器——VIM(转)
查看>>
百度编辑器ueditor通过ajax方式提交,不需要事先转义字符的方法(异常:从客户端(xxx)中检测到有潜在危险的 Request.Form 值)...
查看>>
数组按时间(字符串->Date)排序
查看>>
电信网络拓扑图自动布局之曲线布局
查看>>
sqlserver中的循环遍历(普通循环和游标循环)
查看>>
(原)caffe中fine tuning及使用snapshot时的sh命令
查看>>
日期选择器
查看>>
12个Icon图标资源网站
查看>>
C# winform 广告机 网络多媒体发布系统桌面版之三
查看>>
继续聊WPF——Thumb控件
查看>>