LeetCode的Easy题目

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
如果值相同,就判断左右,在判断右左;递归调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值