Leetcode笔记 python_容易篇

Leetcode刷题笔记(容易篇)

12.16日

1. 两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]在这里插入代码片
        """
       	"""1
        暴力解法:直接遍历
        """
        # for i in range(len(nums) - 1): 
        #     for j in range(i+1, len(nums)):
        #         if nums[i] + nums[j] == target:
        #             return [i, j]
       	"""2
       通过使用enumerate()将列表可以获取下标和值
       使用字典模拟哈希查表法
       
        """
        dict_sum = {}
        for i, num in enumerate(nums):
            temp = target - num
            if temp in dict_sum:
                return [dict_sum[temp],i]
            dict_sum[num] = i

58. 最后一个单词的长度
给定一个仅包含大小写字母和空格 ’ ’ 的字符串,返回其最后一个单词的长度。
如果不存在最后一个单词,请返回 0 。
说明:一个单词是指由字母组成,但不包含任何空格的字符串。
示例:
输入: “Hello World”
输出: 5


class Solution(object):
    def lengthOfLastWord(self, s):
        """
        :type s: str
        :rtype: int
        """
        '''1
        使用str.strip()  将首尾指定的字符去掉,
        然后使用str.split('') 以空格分割,
        取最后一个单词的长度
        '''
        # return len(s.rstrip().split(" ")[-1])

        '''2
        首先从后面遍历找出最后一位不为空格的index
        然后继续遍历,直到碰到' '
        '''
        count = 0 
        n = len(s)-1
        while n>=0 and s[n] == ' ':
            n -= 1
        while n>=0 and s[n] != ' ':
            count += 1
            n -= 1
        return count

12.17日

7. 整数反转
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21

注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """

        if x<0:
            y = -1*int(str(-x)[::-1])
        else:
            y = int(str(x)[::-1])
        if y > 2147483648 or y < -2147483648 :
            y = 0 
        return y

在这里插入图片描述

class Solution(object):
    def myAtoi(self, str):
        """
        :type str: str
        :rtype: int
        """

        # 去掉两边的空格
        s = str.strip()
        # 全空格,无效
        if not s:
            return 0
        # 单个非数字字符,无效
        if len(s) == 1 and not s[0].isnumeric():
            return 0
        # 以数字、+、-以外的字符开头,无效
        if not s[0].isnumeric() and s[0] != '-' and s[0] != '+':
            return 0
        # 提取加减号
        # 加减号提取后仍然以非数字开头,无效
        neg = False
        if s[0] == '-':
            neg = True
            s = s[1:]
            if not s[0].isnumeric():
                return 0
        elif s[0] == '+':
            s = s[1:]
            if not s[0].isnumeric():
                return 0
        # 从左往右提取连续的数字
        numbers = ''
        i = 0
        while i < len(s) and s[i].isnumeric():
            numbers += s[i]
            i += 1 
        # 加上正负号并处理溢出(真是傻逼用python还要处理溢出)
        value = int(numbers)
        if neg:
            if value > 2147483648:
                return -2147483648
            else:
                return 0 - value
        else:
            if value > 2147483647:
                return 2147483647
            else:
                return value

12.18日

13 罗马数字转整数
在这里插入图片描述

class Solution(object):
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """

        d = {'I':1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
        sum = 0
        for i in range(len(s)-1, -1, -1):
            if(i < len(s)-1) and (d[s[i]] < d[s[i+1]]):
                sum -= d[s[i]]
            else:
                sum += d[s[i]]
        return sum

在这里插入图片描述

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if len(strs)==0:
            return ""
        minlen = min([len(x) for x in strs])
        end = 0 
        while end <minlen:
            for i in range(1,len(strs)):
                if strs[i][end] != strs[i-1][end]:
                    return strs[i][:end]
            end += 1
        return strs[0][:end]

在这里插入图片描述

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        temp = [None]
        dic = {')':'(',']':'[','}':'{'}
    
        for t in s:
            if t in dic and dic[t] == temp[len(temp)-1]:
                temp.pop() 
            else:
                temp.append(t)
        return len(temp) == 1


在这里插入图片描述

class Solution(object):
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        思路:由于必须要原地删除,就不考虑用其他数据结构储存。然后可以想到,用指针变量来辅助存储。
        双指针思想:相当于从原地,得到了一个与原数据结构有关联新数据结构。
        题目特征和需要注意的地方:
        1.输入空列表
        如果不加上前提条件,会出现空列表错误
        2.给出的是有序列表(?)
        无序列表无法用此种方法解题
        """
        
        if len(nums)==0:
            return 0
        i=0
        for j in range(1,len(nums)) :
            if nums[i] != nums[j]:
                i +=1
                nums[i]= nums[j]
        return i+1

12.19日

题目描述
在这里插入图片描述

class Solution(object):
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """

        length = 0
        i = 0 
        while i < len(nums):
            if nums[i] != val :
                nums[length] = nums[i]
                length +=1
                i +=1
            else:
                i +=1
        return length 
                

在这里插入图片描述
在这里插入图片描述

class Solution(object):
    def searchInsert(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        right = len(nums)-1
        left = 0
        middle = 0
        while left <= right:
            middle = (left + right) //2
            if nums[middle] == target:
                return middle
            if nums[middle] > target:
                right = middle-1
            if nums[middle] < target:
                left = middle+1
        return left

12.20日

题目描述

在这里插入代码片

12.21日

题目描述

在这里插入代码片

12.22日

在这里插入图片描述
动态规划定义当前最大连续子序列和cur_sum=0cur_sum=0,最大子序和res=nums[0]res=nums[0],数组长度nn对数组进行遍历,对于nums[i]nums[i],存在两种情况:若当前最大连续子序列和cur_sum>0cur_sum>0,说明cur_sumcur_sum对后续结果有着正向增益,即能使后续结果继续增大,则继续加和cur_sum=cur_sum+num[i]cur_sum=cur_sum+num[i]。若当前最大连续子序列和cur_sum<=0cur_sum<=0,说明cur_sumcur_sum对后续结果没有增益或负向增益,即若存在更大的加和,一定是从下一元素开始,加上cur_sumcur_sum,只会使结果更小。因此,令cur_sumcur_sum更新为nums[i]nums[i]。更新最大子序和resres,res=max(res,cur_sum)res=max(res,cur_sum),始终保留最大结果。

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        cur_sum=0
        res=nums[0]
        n=len(nums)
        for i in range(n):
            if(cur_sum>0):
                cur_sum+=nums[i]
            else:
                cur_sum=nums[i]
            res=max(res,cur_sum)    
        return res

在这里插入图片描述

class Solution(object):
    def plusOne(self, digits):
        """
        :type digits: List[int]
        :rtype: List[int]
        """
        number = 0
        for i in range(len(digits)):
            number = number*10 + digits[i]
        number += 1 
        number_str = str(number)
        return [int(i) for i in number_str]

在这里插入图片描述

class Solution(object):
    def addBinary(self, a, b):
        """
        :type a: str
        :type b: str
        :rtype: str
        """
        a = int(a,2)
        b = int(b,2)
        add = bin(a+b )
        return add[2:]

在这里插入图片描述

#参考代码 1:所有的数都放在一起考虑,为了照顾到 00 把左边界设置为 00,为了照顾到 11 把右边界设置为 x // 2 + 1。

PythonJava
class Solution:
    def mySqrt(self, x: int) -> int:
        # 为了照顾到 0 把左边界设置为 0
        left = 0
        # 为了照顾到 1 把右边界设置为 x // 2 + 1
        right = x // 2 + 1
        while left < right:
            # 注意:这里一定取右中位数,如果取左中位数,代码可能会进入死循环
            # mid = left + (right - left + 1) // 2
            mid = (left + right + 1) >> 1
            square = mid * mid

            if square > x:
                right = mid - 1
            else:
                left = mid
        # 因为一定存在,因此无需后处理
        return left

在这里插入图片描述
首先考虑第一步的走法:第一步可以走1级台阶,也可以走2级台阶。那么,设S(n)表示走n级台阶的走法数量,如果第一步走1级台阶,剩下的台阶数为n-1,也就是说这种情况下的走法是相当于S(n-1);同理,如果第一步走2级台阶,剩下的台阶数为n-2,这样的走法相当于
S(n-2);于是,得出递推公式:
S(n) = S(n-1) + S(n-2);
S(1) =1
S(2) = 2
在这里插入图片描述

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        result = [0]*(n+1)
        if n <= 2 :
            return n
        result[1] = 1
        result[2] = 2
        for i in range(3,n+1):
            result[i] = result[i-1] +result[i-2]
        return result[n]


持续更新…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值