day4_leetcode7-9

本文深入探讨LeetCode第7题和第9题的多种解法,包括字符串切片、循环优化及判断语句减少,旨在提升算法效率。通过对比不同解法的时间复杂度,强调减少循环次数和使用顺序结构的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天看到两道很相似的题,所以就一起来谈谈吧。

一. LeetCode第7题

1. 题目
      

 

2. 题意分析
        题目意思很简单,就是它会给你一个整数(正负都可能),然后让你输出这个整数的反转之后的整数,但是如果反转之后的这个数超过了[- 2^31, 2^31-1],这个范围,那么就要返回0(它给的这个整数是在这个范围内的,要判断的只是反转之后的)。这个我们本来可以用循环,将整数的每个数得到之后,利用字符串或者列表的特性,将整数逆向输出,但是这样效率就不高了。下面是我的一些思路。

 

3. 解法一:
         利用str()方法将整数转换成字符串,然后利用字符串的切片操作来得到答案。下面是我的代码:

class Solution(object):
    def reverse(self, x):
        upper_limit = 2147483647   # 上限
        lower_linit = -2147483648  # 下限
        if x < lower_linit or x > upper_limit:  # 判断传入的数有没有超出范围
            return 0
        x = str(x)  # 将该整数转换为字符串类型
        if "-" not in x:  # 判断原先的整数是否为负数,不是负数,则直接切片得到反转后的字符串
            x = x[::-1]
        else:             # 如果是负数,那额由于转换后,我们要保证“-”还是在首位,所以切片是要排除这个负号
            x = x[1:][::-1]
            x = "-" + x
        if int(x) < lower_linit or int(x) > upper_limit:   # 判断反转后的整数有没有超出范围
            return 0
        return int(x)


执行结果:
   

        时间复杂度O(n)=1。
现在来说一下其中关键的一些地方。
         (1)   切片,代码中的x[::-1],就是将原字符串x做反转之后返回。
         (2)   在上面,我们在else中的切片x[1:][::-1],这个意思是,因为这条判断语句执行else的话,说明传入的整数是负数,但是我们要保证待会儿返回时负号是在首位的,所以可以将利用x[1:0]将字符串第1(切片是从0开始的,所以1其实是第二个字符)到最后一位的字符得到,然后利用[::-1]得到反转的字符串,最后在这个字符串首位加上负号就可以了。

 

4. 解法二:
        接下来要想能不能优化一下,当有循环的时候,就考虑能不能减少循环,没有循环时就看能不能减少判断语句,或者是一些多余的语句的删减。按理说,题目是默认传入的整数不会超出范围的,所以我们可以将第一个判断语句删了。
我的代码:

class Solution(object):
    def reverse(self, x):
        upper_limit = 2147483647
        lower_linit = -2147483648
        x = str(x)
        if "-" not in x:
            x = x[::-1]
        else:
            x = x[1:][::-1]
            x = "-" + x
        x = int(x)
        if x < lower_linit or x > upper_limit:
            return 0
        return x


执行结果:




       效果比第一种方法好很多。但是我们仅仅只是删除了一个判断语句而已,感觉挺神奇的。


5. 最优解:

          

        这个有点没太想明白,他这个有while循环,但是时间却这么短。只能这样解释了,就是python对于简单的数学运算要比字符串的切片快很多。看来有时间得去看一下关于python中字符串、列表、字典这些东西的索引、切片等操作的是如何实现的了。

 

二. LeetCode第9题

 

1. 题目

              

 

2.解法一:

        这个没什么好说的,思路还是用先转化为字符串,反转后判断是否和原来的字符串一样就可以了,注意,这个题目的意思是只要有负号,那就一定不是回文数了。


代码如下:      

class Solution:
    def isPalindrome(self, x):
        x = str(x)
        trans_x = x[::-1]
        if trans_x == x:
            return True
        else:
            return False


执行结果:



       

       这个我试过用不转化为字符串,直接利用整数的取余等将这个整数反转,然后判断是否相等,但是不知道是我的方法不对还是什么,时间比这个要长了20多ms,所以就不展示了。

 

3.最优解:
             
        这。。。。那我把我的代码改一下吧,就把最后一个else那个改了,代码如下:

class Solution:
    def isPalindrome(self, x):
        x = str(x)
        trans_x = x[::-1]
        if trans_x == x:
            return True
        return False


现在来看一下执行结果:


竟然快了40多ms,看来顺序结构真的比判断语句要快啊。

 

总结:

        一般来说,还是要尽可能的减少循环次数,在循环次数不能再减的时候,要考虑顺序结构比条件判断语句要快,所以可以减少一些不必要的判断分支。另外,要抽时间看一下关于python内部执行切片、索引等操作的原理了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大骨熬汤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值