leetcode用python还是c_刷Leetcode里面遇到的问题(Python)

新年伊始,换了新的现场。总体来说比之前宽松了不少,正好有了多余的时间去刷刷题。这篇文章就当作自己的学习笔记,不定期更新。自己还是初级水平,慢慢来,碰到好的代码也要学习一下!

====================================================

・比较两个二叉树,相同返回true,不相同返回false。

之前自己想了一个好复杂的方法,结果因为太复杂了折腾了一下午也没把代码实现出来。今天上午又想了好久,感觉用递归肯定能解决,但是没有好的思路,遂终放弃。然后打开讨论里面,看到大神写的三行代码,惊为天人,摘抄如下:

def isSameTree(self, p, q):

if p and q:

return p.val == q.val and self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)

return p is q

仔细一想,确实最终结果只需要比较两个树是不是一样就可以,反观自己想的又是建序列记录走过的node,又要比较数组的异同,确实有点过于复杂了。大神的程序不止适用于这道题,后来凭借着这个思路,算二叉树长度什么的也是分分钟就出来了。

==================================================

・检测两个括号是否匹配,"{[]}"和"((()))"这样能配对的都返回True,"[{(})]"和"())"等无法配对的都返回false。

记得刚看到这道题的时候,我也是设计了好复杂的一个算法,记录每个括号啊,前后查找匹配啊。后来也记不太清是灵光一现还是看到了讨论区的大神代码,反正用一个好简单易懂的方式就解决了:

def isValid(self, s):

""":type s: str:rtype: bool"""

for i in range(len(s)//2 + 1):

s = s.replace("()",'')

s = s.replace("[]",'')

s = s.replace("{}",'')

if len(s) == 0:

break

if len(s) <= 0:

return True

else:

return False

就是不停的去掉配对,去掉完就得了,简单粗暴。

======================================================

・今天刷到了一个特别简单的题,但是要求很特别:给出一个非空数列,且除了一个数字之外皆两两成对(如:[1,2,1,2,3,4,4]这种),求那个唯一的单身狗。

讲真,第一眼看到这道题我是拒绝的,单身狗招谁惹谁了,凭啥你们成双成对然后还得把我挑出来?拒绝归拒绝,单身狗这种东西目前为止还是不太被世人所接受的,所以我写了如下的代码:

class Solution:

def singleNumber(self, nums):

""":type nums: List[int]:rtype: int"""

i = nums.pop()

while(i in nums):

nums.remove(i)

i = nums.pop()

if len(nums) <= 0:

break

return i

第一眼看去好像挺整洁,挺简单粗暴的。从数列末尾pop出一个数字,有一样的就把那个一样的踢出去,总之是个情侣滚粗,对单身狗比较友好的算法。但这时我发现题目里面有一个附加条件,除了找出单身狗之外,还说尽量不适用额外的memory。Emmmmm,我这个算是使用了额外的memory了么?还得容我查查,但在这之前,果然讨论区卧虎藏龙,有个大佬用一行代码就解决了问题(而且还不止一种方法,膜拜)现把代码记录在下面:

def singleNumber4(self, nums):

return reduce(lambda x, y: x ^ y, nums)

这里面用到了一个高阶函数——reduce,reduce()简单来说就是一个整体处理的函数,讲的太深奥也难懂,有个例子的话就很好懂了:

One_Array = [1, 2, 3, 4, 5]

print(reduce(add, One_Array))

这个输出的结果就是15,其实也就是1+2+3+4+5的结果。add就是+,常用的还有sub(减)和mul(乘)这样一个函数一出来,就可以对数列进行一个整体的处理。顺带一提,刚刚的代码里用了sub的话,最后结果是-13,因为1-2-3-4-5=-13,完全按照顺序,不会自动按照大小排序什么的。add的位置除了指定的运算方式,还可以像大神一样加入lambda式(lam式解释起来也好麻烦,下次碰到好题我会记在下面)这样整个式子就变成了:a^b^c^d^e ,其中 ^ 的运算是排他论理和(好像是个很难懂的东西),简单来说就是两次^了一样的值会自动抵消掉:a^b^b → a,也是一个情侣滚粗的计算式,很好。总之,用^加reduce对数列进行整体处理,单身狗就这样被找出来了,可喜可贺,可喜可贺!

=======================================================

今天刷了两道特别简单的题,一个是摆硬币,还有一个是经典的FizzBuzz。不过主要目的不是为了证明自己能写出来,而是要看看自己算法的速度能改进多少。果然一测试就有点傻眼了,如果用传统的while文写速度不容乐观。

比如FizzBuzz里面只用while加if写的话,就不如for和if写的快。(我的while用时68ms,而基本同一思路的for文却只有52ms)上网查了不少霓虹程序员的测验,果然是while比for慢了好几条街,而且千万千万别用双重while循环,那速度简直了。反观双重for循环倒是没比单重慢多少,有趣的现象,有时间慢慢验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值