8题string转int,没什么大问题一遍就过了说是中等算是很水的一道题注意点比较多比较坑比如+-2 =-2这种情况。
主要一个函数去除string中的空格 s.lstrip(str) 默认空格,当然可以去除其他形式的,只从左边开始去除哦注意str如果是字符串是一个一个字符匹配而不是整个str去匹配。
9题回文呢,很简单直接把整数转string 然后切片逆序比较即可,这里说一下官方题解吧感觉挺有意思的,害怕反转过来整数溢出,于是只反转一半,设置一个新的变量y,假使原整数为x,那么每次对x%10取出后一位数,对y*10+取出的数作为反转后的数,当x<y的时候代表已经反转到一半啦然后进行比较即可,核心代码如下。
while y<x:
y = y*10 + x%10
x = x/10
return y==x or y//10==x
之所以y可能➗10就是如果原整数是奇数的时候,中间那一位被归置y中了但是这一位无论是啥对结果都不影响,所以除掉这一位就行啦。
11.
嗯这道题自己的方法没过,我用的也就是稍微优化的o(n2)的方法,也就是从左到右计算每一个矩形的面积,如果当前数组的值小于之前记录的最大的值就不计算,最后有3个用例时间超时过不了,嗯还是题解的o(n)方法吧。
我们需要保证的是两条线的高度其中矮的那一条尽可能高,同时两条线离得距离尽可能远!于是设置双指针的方法首先从开头和结尾进行扫描,然后找到两条线中最短的将那条往里面靠近寻找是否有更大的面积即可。
12.罗马转int。没什么意思直接AC了。
16.最接近的三数之和,这个跟三数之和一个道理了,通过设置双指针的方法将时间复杂度从o(n3)变为o(n2)。
17.四数之和,没得说 先固定两个数然后比葫芦画瓢按照三数之和的方法计算。
只不过中间加了一些优化 还是没达到o(n3)
# 防止重复 数组进入 res
if i > 0 and nums[i] == nums[i-1]:
continue
# 当数组最小值和都大于target 跳出
if nums[i] + nums[i+1] + nums[i+2] + nums[i+3] > target:
break
# 当数组最大值和都小于target,说明i这个数还是太小,遍历下一个
if nums[i] + nums[n-1] + nums[n-2] + nums[n-3] < target:
continue