标签(空格分隔): 算法题,代码网上都有,就只贴一下github了。这里主要总结一下从题目中学到的,如何举一反三
好像很简单,上来就两个粗暴循环了。也想到时间复杂度是个问题,但是并没有想太多,看到discuss里的答案,才真正发现题目不难,想个好的方法是比较重要的。
类似的,输入输出的元素都是一个列表中的,重点考虑取出另存放,然后比较的操作,可以节省复杂度。
看题目就好比一个计数器,用来算加法。重点考虑到下一位的进位,两个数的长度,结果的长度
在加法时,如果下一结点为空就不再加,因此随时判断下一结点是否为空;
对于新建链表,添加元素,对p=Node(x)建立,最后因为p=p.next,会多余0,为了得到准确结果,用p.next=Node(x),这样首元素多余0,返回时返回res.next即可!
将输入的数反转:开始考虑得到数值存入list,然后反转乘10的幂次。这样浪费了存储空间,并且运算也复杂了。
在取数据的同时也在计算结果数据,操作时取绝对值,最后返回时判断正负!
while (y != 0):
res = 10 * res + y % 10
y = int(y / 10)
在反转时,还要考虑数值是否超过4个字节的有符号整数;
回文就是正反读都一样
这个题目就简单多了,将利用三的反转,最后返回x==res即可
将罗马数字转为阿拉伯数字,知道规则还好做,否则不知道怎么做。
一串遍历元素,而且和前元素相关,判断计算即可。
获取最长前缀
先说一下思路:按下表取每一个字符串的字符,添加到set()集合中,set()集合具有去重的特点,元素都是单一的。因此,对应下标添加,然后判断长度,如果不为1,那么就返回该下标即可;如果是1,清空set()集合,继续判断接下来的字符。与那些题目答案不太一样,贴一下
class Solution:
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if strs.__contains__('') or strs == '':
return ''
temp = set()
length = min((len(s)) for s in strs)
for i in range(length):
for ss in strs:
temp.add(ss[i])
if len(temp) != 1:
return strs[0][:i]
else:
temp.clear()
continue
return strs[0][:length]
if __name__ == '__main__':
test = Solution()
print(test.longestCommonPrefix(['abcwbrb', 'abcwrgh', 'abcd', '']))
判断文本的括号是否正确,数据结构中的栈专门解决这个问题。
建立括号的字典,以获取判断;如果该括号是开括号,那么存储在list中,如果是闭括号,就要判断list是否为空,如果为空,说明之前括号抵消,这个闭括号错误;同时还要判断该闭括号对应的开括号,是否和最近的开括号一样,并且还要将开括号弹出,因此用pop,如果一样,那么正确,否则则错误;遍历之后,还有可能这种情况’((((()’遍历结束后,还要通过判断最后栈中是否还有元素来确定是否正确!
括号匹配问题:
class Solution:
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
if len(s) % 2 != 0:
return False
stack = []
brackets = {"]": "[", "}": "{", ")": "("}
for ss in s:
if ss in brackets.values():
stack.append(ss)
elif stack != [] and brackets.get(ss) == stack.pop():
continue
else:
return False
return stack == []
题目解析:
因为是有序列表,故从头到尾:判断非空取值,然后谁小谁就添加到新链表后面,并且该指针后移
因为具有相似性,所以,下题考虑合并两个有序数组
因为两个数组合并后nums1的长度确定为m+n
判断m,n是否大于0:倒序判断两数组元素,哪个大就放在nums1的最后;当某个数组元素遍历完之后,将nums2未遍历的元素直接对应位置覆盖nums1即可。
与上题比较:
链表是判断取小增加结点直到最后;数组是往后放大!
正好与下题链表元素去重对应。
数组去重:对于该数组,从头到尾两个指针,一个遍历,另一个更新列表(不同保留,同则不变)到最后
从头到尾粗暴遍历,前后相同,就链接到后个结点
数组去重:对于该数组,从头到尾两个指针,一个遍历,另一个更新列表
利用字符串对象的contains(needle) 方法
遍历查找第一个大的下表返回
正则分组取数。?
遍历,遍历array,对于每一个数字,我们判断,(之前的sum + 这个数字) 和 (这个数字) 比大小,如果(这个数字)自己就比 (之前的sum + 这个数字) 大的话,那么说明不需要再继续加了,直接从这个数字,开始继续,因为它自己已经比之前的sum都大了。反过来,如果 (之前的sum + 这个数字)大于 (这个数字)就继续加下去。
空格分词,选非空的最后一词的长度
以列表的形式给定一整数,加1;然后再以列表形式返回。字符串转整数;
只有1,1时才进1,然后前位相加,算完再递归加进位,补0;
1,0或者0,1,末尾补1,前位相加;
0,0前位相加,末尾补0
找出递归公式,实质是斐波那契数列
判断非空;如果后者相同,就链接到后一个
大的就往后放,最后取nums1
二者都为None是返回True,有一个为None返回False
如果值相同,就判断左,相同再比较右;递归调用
二者都为None是返回True,有一个为None返回False
如果值相同,就判断左右,在判断右左;递归调用