LeetCode的Easy题目
标签(空格分隔): 算法题,代码网上都有,就只贴一下github了。这里主要总结一下从题目中学到的,如何举一反三
一、Two Sum
好像很简单,上来就两个粗暴循环了。也想到时间复杂度是个问题,但是并没有想太多,看到discuss里的答案,才真正发现题目不难,想个好的方法是比较重要的。
题目总结
类似的,输入输出的元素都是一个列表中的,重点考虑取出另存放,然后比较的操作,可以节省复杂度。
二、Add Two Numbers
看题目就好比一个计数器,用来算加法。重点考虑到下一位的进位,两个数的长度,结果的长度
题目总结
在加法时,如果下一结点为空就不再加,因此随时判断下一结点是否为空;
对于新建链表,添加元素,对p=Node(x)建立,最后因为p=p.next,会多余0,为了得到准确结果,用p.next=Node(x),这样首元素多余0,返回时返回res.next即可!
三、Reverse Integer
将输入的数反转:开始考虑得到数值存入list,然后反转乘10的幂次。这样浪费了存储空间,并且运算也复杂了。
题目总结
在取数据的同时也在计算结果数据,操作时取绝对值,最后返回时判断正负!
while (y != 0):
res = 10 * res + y % 10
y = int(y / 10)
在反转时,还要考虑数值是否超过4个字节的有符号整数;
四、Palindrome Number
回文就是正反读都一样
这个题目就简单多了,将利用三的反转,最后返回x==res即可
五、Roman to Integer
将罗马数字转为阿拉伯数字,知道规则还好做,否则不知道怎么做。
一串遍历元素,而且和前元素相关,判断计算即可。
六、Longest Common Prefix
获取最长前缀
先说一下思路:按下表取每一个字符串的字符,添加到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', '']))
七、Valid Parentheses
判断文本的括号是否正确,数据结构中的栈专门解决这个问题。
建立括号的字典,以获取判断;如果该括号是开括号,那么存储在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 == []
八、21合并两个有序链表
题目解析:
因为是有序列表,故从头到尾:判断非空取值,然后谁小谁就添加到新链表后面,并且该指针后移
因为具有相似性,所以,下题考虑合并两个有序数组
九、88合并有序数组
因为两个数组合并后nums1的长度确定为m+n
判断m,n是否大于0:倒序判断两数组元素,哪个大就放在nums1的最后;当某个数组元素遍历完之后,将nums2未遍历的元素直接对应位置覆盖nums1即可。
与上题比较:
链表是判断取小增加结点直到最后;数组是往后放大!
十、有序数组中元素去重
正好与下题链表元素去重对应。
数组去重:对于该数组,从头到尾两个指针,一个遍历,另一个更新列表(不同保留,同则不变)到最后
十一、有序链表去重
从头到尾粗暴遍历,前后相同,就链接到后个结点
十二、删除列表中某元素
数组去重:对于该数组,从头到尾两个指针,一个遍历,另一个更新列表
十三、实现字符串子串索引
利用字符串对象的contains(needle) 方法
十四、查询插入位置
遍历查找第一个大的下表返回
十五、Count And Say
正则分组取数。?
十六、和最大的子数组
遍历,遍历array,对于每一个数字,我们判断,(之前的sum + 这个数字) 和 (这个数字) 比大小,如果(这个数字)自己就比 (之前的sum + 这个数字) 大的话,那么说明不需要再继续加了,直接从这个数字,开始继续,因为它自己已经比之前的sum都大了。反过来,如果 (之前的sum + 这个数字)大于 (这个数字)就继续加下去。
十七、字符串最后一个单词的长度
空格分词,选非空的最后一词的长度
十八、PlusOne
以列表的形式给定一整数,加1;然后再以列表形式返回。字符串转整数;
十九、二进制加法
只有1,1时才进1,然后前位相加,算完再递归加进位,补0;
1,0或者0,1,末尾补1,前位相加;
0,0前位相加,末尾补0
二十、爬梯子
找出递归公式,实质是斐波那契数列
二十一、有序链表去重
判断非空;如果后者相同,就链接到后一个
二十二、合并两个有序数组
大的就往后放,最后取nums1
二十三、判断树是否相同
二者都为None是返回True,有一个为None返回False
如果值相同,就判断左,相同再比较右;递归调用
二十四、判断树是否对称
二者都为None是返回True,有一个为None返回False
如果值相同,就判断左右,在判断右左;递归调用