19.删除链表倒数第k个节点
这个之前在牛客上做过,直接设置双指针啦,第一个指针从链表开头出发,第二个指针从k位置出发,两个指针同时前移只要第二个指针为空就证明第一个指针到了倒数第k个位置咯。注意要设置一个新的起始点链接到head前面然后返回这个起始点的next节点(因为head节点也有可能是倒数第k个位置!)
20.有效的括号
题意很简单 直接用栈的形式计算即可,全部左括号都入栈,然后遇到右括号就弹栈判断,第一遍没过是最后忘记判断栈中是否还有元素了!如果有多出的左括号也是不对的。
在py中没有明确定义栈结构,但是list可以当作栈来用,入栈就是append操作,弹栈就是pop操作嘻嘻。
21.合并两个有序链表
我用的迭代法设置一个指针,如果两个链表不为空就将当前最小的值链接到指针,最后把没有用完的链表直接连接到后面。
官方题解给了个递归的做法。也就是
22.括号生成,给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
判断方法很简单因为只有一种类型的括号,不需要用栈了,直接设置一个哨兵值碰到左括号+1右括号-1如果最后正好等于0就是有效括号。这里主要是如何生成所有的括号组合!
我上来用了排列的方式结果超时了
def permutation(s,i):
if i == len(s):
//判断当前s是否满足有效
else :
for j in range (i,len(s)):
s[j],s[i] == s[i],s[j]
permutation(s,i+1)
s[j],s[i] = s[i],s[j]
看了题解,因为括号只有两种直接全排列必定出现很多重复了,所以应该这样设置回溯的方式
if len(A)== 2*n:
if self.isValid(A):
result.append("".join(A))
else:
A.append('(')
self.permutation(A,result,n)
A.pop()
A.append(')')
self.permutation(A,result,n)
A.pop()
return result
26.27属于同一类题目,26是o(1)空间复杂度移除list中重复元素,27是o(1)空间复杂度移除list中某个值。
其思路都是设置双指针的方法,第一个指针为慢指针i,第二个指针为快指针j,用第二个指针扫描整个数组,26的话碰到由于已经排好序了碰到新的元素就把当前i的值+1,然后把当前j指向的元素赋予给i,这样从i开始的元素就是之后符合条件的元素。27同理。
28.查找string中是否有某个子串。嘻嘻偷懒直接调用了string内置函数了。
find函数 str.find(x,start,end) 返回x在str中第一次出现的索引,从start到end。如果包含子字符串返回开始的索引值,否则返回-1。
35.搜索插入位置,对一个有序list查找某个target是否在list中,在返回索引,不在的话返回其应该插入的位置。
嗯就二分查找,主要复习一个list的index方法。
list.index(x),返回x在list中的索引,如果没有就抛出异常。
python中异常处理就是 try except。