Leetcode 随机题库练习(第三周)

假期 Leetcode 随机题库练习记录(第三周)

2022.08.20

如果数组是单调递增或单调递减的,那么它是 单调 的。
如果对于所有 i <= j,nums[i] <= nums[j],那么数组 nums 是单调递增的。 如果对于所有 i <= j,nums[i]> = nums[j],那么数组 nums 是单调递减的。
当给定的数组 nums 是单调数组时返回 true,否则返回 false。
输入:nums = [1,2,2,3]
输出:true

# 最笨的办法,反正就是排序判断是不是单调递增和单调递减
class Solution(object):
    def isMonotonic(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        min_nums = sorted(nums)
        max_nums = sorted(nums,reverse=True) 
        if nums == min_nums:
            return True
        elif nums == max_nums:
            return True
        else:
            return False
        return True

今天忙着会议的事情,可是把我累死了!!

2022.08.21

给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换。
完成所有替换操作后,请你返回这个数组。
输入:arr = [17,18,5,4,6,1]
输出:[18,6,6,6,1,-1]
解释:

  • 下标 0 的元素 --> 右侧最大元素是下标 1 的元素 (18)
  • 下标 1 的元素 --> 右侧最大元素是下标 4 的元素 (6)
  • 下标 2 的元素 --> 右侧最大元素是下标 4 的元素 (6)
  • 下标 3 的元素 --> 右侧最大元素是下标 4 的元素 (6)
  • 下标 4 的元素 --> 右侧最大元素是下标 5 的元素 (1)
  • 下标 5 的元素 --> 右侧没有其他元素,替换为 -1
# 今天是会议第二天,好累啊,没力气解题了,直接看了后面的解析,按照解析写了一遍题目
class Solution(object):
    def replaceElements(self, arr):
        """
        :type arr: List[int]
        :rtype: List[int]
        """
        n = len(arr)
        ans = [0] * (n - 1) + [-1]
        for i in range(n - 2, -1, -1):
            ans[i] = max(ans[i + 1], arr[i + 1])
        return ans

2022.08.22

给你一个字符串 date ,按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。
输入:date = “2019-01-09”
输出:9
解释:给定日期是2019年的第九天。

#end 累死了!! 暴力解法
#这个地方有一个是1900年是平年,好吧,小学没学好...有朋友知道的可以帮忙科普一下
class Solution(object):
    def dayOfYear(self, date):
        """
        :type date: str
        :rtype: int
        """
        times=[]
        for i in date.split('-'):
            i = int(i)
            times.append(i)

        year, month, day = times[0],times[1],times[2]

        day1 = [0,31,29,31,30,31,30,31,31,30,31,30]
        day2 = [0,31,28,31,30,31,30,31,31,30,31,30]

        day_num = day

        if year == 1900:
            for i in range(1,month):
                day_num += day2[i] 

        elif year % 4 == 0:
            for i in range(1,month):
                day_num += day1[i] 
        else:
            for i in range(1,month):
                day_num += day2[i]
        return day_num

2022.08.23

找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3

#这很简单的题目呀,因为只需要输出任意一个重复的元素就可以了,那我们就选第一个
nums = [2, 3, 1, 0, 2, 5, 3]
class Solution(object):
    def findRepeatNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        element = []
        repetition_element = []

        for i in nums:
            if i not in element:
                element.append(i)
            else:
                repetition_element.append(i)
                break 
        return repetition_element[0]
#法二
#repetition_element = []
#for i in nums:
#   if nums.count(i)>1:
#        repetition_element.append(i)
#        break
#其实我觉得法二更好一些,但是总是超出时间限制,可能是count的时候会遍历所有元素,
#所以时间复杂度高一点

Leetcode 随机题库练习(第三周)_第1张图片

2022.08.24

给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”

#我的解法有点鸡肋,借用一个参考代码的思路吧,这个pop()函数就很有效的概括出来有效的括号
class Solution(object):
    def longestValidParentheses(self, s):
        """
        :type s: str
        :rtype: int
        """
        if not s:
            return 0
        res = 0
        stack = [-1]
        for i in range(len(s)):
            if s[i] == "(":
                stack.append(i)
            else:
                stack.pop()
                if not stack:    #判断stack中是否为空,True 表示空的
                    stack.append(i)
                else:
                    res = max(res,i - stack[-1])
        return res

2022.08.25

给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3 x 3^x 3x
输入:n = 27
输出:true

#首先要明白,n <= 0 是不可能作为3的幂次方的,其次循环 %3 即可
class Solution(object):
    def isPowerOfThree(self, n):
        """
        :type n: int
        :rtype: bool
        """
        if n <= 0:
            return False
        else:
            while n % 3 == 0:
                n //=3
        if n == 1:
            return True
        else:
            return False

2022.08.26

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
输入: num = 38
输出: 2
解释: 各位相加的过程为:
38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2
由于 2 是一位数,所以返回 2。

#直接while循环就可以了
class Solution(object):
    def addDigits(self, num):
        """
        :type num: int
        :rtype: int
        """
        a = str(num)
        while len(a) > 1:
            b = 0
            for i in a:
                b += int(i)
            a = str(b)
        return int(a)

又是一周结束了。好像明天就是正式开学了,时间真快。

你可能感兴趣的:(Leetcode,随机题库练习,leetcode,算法,职场和发展)