zoukankan      html  css  js  c++  java
  • Leetcode题目practice

    Leetcode题目解答

    1. 删除最外层的括号

    有效括号字符串为空("")、"(" + A + ")" 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 "(()(()))" 都是有效的括号字符串。

    如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。

    给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + ... + P_k,其中 P_i 是有效括号字符串原语。

    对 S 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S

    示例1

    输入:"(()())(())"
    输出:"()()()"
    解释:
    输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())",
    删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。
    

    示例2

    输入:"(()())(())(()(()))"
    输出:"()()()()(())"
    解释:
    输入字符串为 "(()())(())(()(()))",原语化分解得到 "(()())" + "(())" + "(()(()))",
    删除每隔部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。
    

    示例3

    输入:"()()"
    输出:""
    解释:
    输入字符串为 "()()",原语化分解得到 "()" + "()",
    删除每个部分中的最外层括号后得到 "" + "" = ""。
    

    提示:
    1. S.length <= 10000
    2. S[i] 为 "(" 或 ")"
    3. S 是一个有效括号字符串

    class Solution:
        def removeOuterParentheses(self, S):
            '''
            type: S:str
            rtype:str
            '''
            a = 0
            b = 0
            s = ""
            for i in range(len(S)):
                if S[i] == '(':
                    a += 1
                else:
                    b += 1
                if a == b:
                    s = s + S[i-2*(a-1):i]
                    a = 0
                    b = 0
            return s
    if __name__ =='__main__':
        S1 = '(()())(())'
        S2 = '(()())(())(()(()))'
        S3 = '()()'
        solution = Solution()
        s1 = solution.removeOuterParentheses(S1)
        s2 = solution.removeOuterParentheses(S2)
        s3 = solution.removeOuterParentheses(S3)
        print(f'"{s1}"')
        print(f'"{s2}"')
        print(f'"{s3}"')
    
    "()()()"
    "()()()()(())"
    ""
    

    2. 两数之和

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

    示例:

    给定 nums = [2, 7, 11, 15], target = 9
    因为 nums[0] + nums[1] = 2 + 7 = 9
    所以返回 [0, 1]
    
    class Solution:
        def twoSum(self, nums, target):
            '''
            type: nums:List[int]
            type: target:int
            rtype: list
            '''
            for i in nums:
                lis = nums[nums.index(i)+1:]
                if (target - i) in lis:
                    return [nums.index(i),lis.index(target - i)+nums.index(i)+1]
                    break
    if __name__ =='__main__':
        nums = [2, 7, 11, 15]
        target = 9
        solution = Solution()
        s = solution.twoSum(nums,target)
        print(s)
    
    [0, 1]
    

    3. 宝石与石头

    给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。

    J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。

    示例1

    输入: J = "aA", S = "aAAbbbb"
    输出: 3
    

    示例2

    输入: J = "z", S = "ZZ"
    输出: 0
    

    提示

    • S 和 J 最多含有50个字母。
    • J 中的字符不重复。
    class Solution:
        def numJewelsInStones(self, J, S):
            '''
            type: J:str
            type: S:str
            rtype:int
            '''
            s = 0
            for i in range(len(J)):
                s += S.count(J[i])
            return s
    if __name__ =='__main__':
        J1 = "aA"
        S1 = "aAAbbbb"
        J2 = "z"
        S2 = "ZZ"
        solution = Solution()
        s1 = solution.numJewelsInStones(J1,S1)
        s2 = solution.numJewelsInStones(J2,S2)
        print(f'{s1}
    {s2}')
    
    3
    0
    

    4. 移除元素

    给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。

    不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

    元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

    示例1

    给定 nums = [3,2,2,3], val = 3,
    函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
    你不需要考虑数组中超出新长度后面的元素。
    

    示例2

    给定 nums = [0,1,2,2,3,0,4,2], val = 2,
    函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
    注意这五个元素可为任意顺序。
    你不需要考虑数组中超出新长度后面的元素。
    

    说明

    为什么返回数值是整数,但输出的答案是数组呢?

    请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

    • 你可以想象内部操作如下:

      1. nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝

      int len = removeElement(nums, val);

      1. 在函数里修改输入数组对于调用者是可见的。
      2. 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。

      for (int i = 0; i < len; i++) {

        print(nums[i]);  }
      
    class Solution:
        def removeElement(self, nums, val):
            '''
            type: nums: List[int]
            type: val:int
            rtype: int
            '''
            for i in range(nums.count(val)):
                nums.remove(val)
            return len(nums)
    if __name__ =='__main__':
        nums1 = [3,2,2,3]
        val1 = 3
        nums2 = [0,1,2,2,3,0,4,2]
        val2 = 2
        solution = Solution()
        s1 = solution.removeElement(nums1,val1)
        s2 = solution.removeElement(nums2,val2)
        print(f'{s1}  {nums1[:s1]}')
        print(f'{s2}  {nums2[:s2]}')
    
    2  [2, 2]
    5  [0, 1, 3, 0, 4]
    

    5.删除排序数组中的重复项

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

    不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

    示例1

    给定数组 nums = [1,1,2], 
    函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 
    你不需要考虑数组中超出新长度后面的元素。
    

    示例2

    给定 nums = [0,0,1,1,1,2,2,3,3,4],
    函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
    你不需要考虑数组中超出新长度后面的元素。
    

    说明

    为什么返回数值是整数,但输出的答案是数组呢?

    请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

    • 你可以想象内部操作如下:

      1. nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝

        int len = removeDuplicates(nums);

      2. 在函数里修改输入数组对于调用者是可见的。

      3. 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。

      for (int i = 0; i < len; i++) {

        print(nums[i]);
      

      }

    class Solution:
        def removeDuplicates(self, nums):
            '''
            type: nums:List[int]
            rtype:int
            '''
            a = 0
            for i in range(len(nums)):
                if nums[i] not in nums[:a]:
                    nums[a] = nums[i]
                    a += 1
            return a
    if __name__ =='__main__':
        nums1 = [1,1,2]
        nums2 = [0,0,1,1,1,2,2,3,3,4]
        solution = Solution()
        s1 = solution.removeDuplicates(nums1)
        s2 = solution.removeDuplicates(nums2)
        print(f'{s1}  {nums1[:s1]}')
        print(f'{s2}  {nums2[:s2]}')
    
    2  [1, 2]
    5  [0, 1, 2, 3, 4]
    

    6.寻找两个有序数组的中位数

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

    请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

    你可以假设 nums1 和 nums2 不会同时为空。

    示例 1:

    nums1 = [1, 3]
    nums2 = [2]
    
    则中位数是 2.0
    

    示例 2:

    nums1 = [1, 2]
    nums2 = [3, 4]
    
    则中位数是 (2 + 3)/2 = 2.5
    
    class Solution:
        def findMedianSortedArrays(self, nums1, nums2):
            '''
            type:nums1: List[int]
            type:nums2: List[int]
            rtype:float
            '''
            nums1.extend(nums2)
            nums1.sort()
            length_nums1 = len(nums1)
            if length_nums1 % 2 != 0:
                i = length_nums1 // 2
                return float(nums1[i])
            else:
                i = length_nums1 // 2
                return float((nums1[i]+nums1[i-1])/2)
    if __name__ =='__main__':
        nums11 = [1, 3]
        nums12 = [2]
        nums21 = [1, 2]
        nums22 = [3, 4]
        solution = Solution()
        s1 = solution.findMedianSortedArrays(nums11,nums12)
        s2 = solution.findMedianSortedArrays(nums21,nums22)
        print(s1)
        print(s2)
    
    2.0
    2.5
    

    7.盛最多水的容器

    给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

    说明:你不能倾斜容器,且 n 的值至少为 2。


    图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

    示例:

    输入: [1,8,6,2,5,4,8,3,7]
    输出: 49
    
    class Solution:
        def maxArea(self, height):
            '''
            type height:List[int]
            rtype:int
            '''
            area_max = 0
            i = 0
            j = len(height)-1  
            while i < j:
                if height[i] > height[j]:
                    area_max = max(area_max,height[j]*(j-i))
                    j -= 1
                else:
                    area_max = max(area_max,height[i]*(j-i))
                    i += 1
            return area_max
    if __name__ =='__main__':
        nums = [1,8,6,2,5,4,8,3,7]
        solution = Solution()
        s1 = solution.maxArea(nums)
        print(s1)
    
    49
    

    8.存在重复元素

    给定一个整数数组,判断是否存在重复元素。

    如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

    示例1

    输入: [1,2,3,1]
    输出: true
    

    示例2

    输入: [1,2,3,4]
    输出: false
    

    示例3

    输入: [1,1,1,3,3,4,3,2,4,2]
    输出: true
    
    class Solution:
        def containsDuplicate(self, nums):
            '''
            type: nums: List[int]
            rtype: bool
            '''
            nums_set = set(nums)
            if len(nums) != len(nums_set):
                return bool(1)
            else:
                return bool(0)
    if __name__ =='__main__':
        nums1 = [1,2,3,1]
        nums2 = [1,2,3,4]
        nums3 = [1,1,1,3,3,4,3,2,4,2]
        solution = Solution()
        s1 = solution.containsDuplicate(nums1)
        s2 = solution.containsDuplicate(nums2)
        s3 = solution.containsDuplicate(nums3)
        print(f'{s1}
    {s2}
    {s3}')      
    
    True
    False
    True
  • 相关阅读:
    增加工作日排序字段
    HIVE分析函数
    hive取等分数据
    HIVE锁相关
    shell脚本启动java程序
    Jetbrain ide Avaliable servers
    SPARK调优
    SQL 十分位
    HDFS配额查询
    jQuery 选择器
  • 原文地址:https://www.cnblogs.com/Hades123/p/10851387.html
Copyright © 2011-2022 走看看