lettcode 题目

2018-06-03  本文已影响0人  vckah
def isValid(s):
    """
    :type s: str
    :rtype: bool
    """
    length = len(s)
    if length == 0:
        return True
    if length%2 != 0:
        return False
    stack = []
    dic = {"]":"[", "}":"{", ")":"("}
    for char in s:
        if char in dic.values():
            stack.append(char)
        elif char in dic.keys():
            if stack == [] or dic[char] != stack.pop():
                return False
        else:
            return False
    return stack == []

在评论区看到一种比较。。。 的做法,利用字符串的特性,核心代码如下:

while '()' in s or '{}' in s or '[]' in s:
            s = s.replace('{}','').replace('()','').replace('[]','')
return not bool(s)
def generateParenthesis(n):
    """
    :type n: int
    :rtype: List[str]
    """
    ans = []
    def backtrace(S='', left=0, right=0):
        if len(S) == 2*n:
            ans.append(S)
            return
        if left < n:
            backtrace(S+'(', left+1, right)
        if right < left:
            backtrace(S+')', left, right+1)
    backtrace()
    return ans
import itertools
def letterCombinations(digits):
    """
    :type digits: str
    :rtype: List[str]
    """
    import itertools
    mapping = {"2":"abc", "3":"def", "4":"ghi", "5":"jkl", "6":"mno",
               "7":"pqrs", "8":"tuv", "9":"wxyz"}
    s = [mapping[d] for d in digits if d in mapping]
    return [] if digits == "" else [ "".join(x) for x in itertools.product(*s)]
def removeDuplicates(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    n = len(nums)
    if n == 0:
        return 0
    i = 0    # 前一个数字
    for j in range(n):
        if nums[j] != nums[i]:
            i+=1 
            nums[i] = nums[j]
    return i+1
def removeElement(nums, val):
    """
    :type nums: List[int]
    :rtype: int
    """
    n = len(nums)
    i = 0    # 前一个数字
    for j in range(n):
        if nums[j] != val:
            nums[i] = nums[j]
            i += 1
    return i
if haystack == "" and needle == "":
            return 0
        if needle == "":
            return 0
        if haystack == "" or needle == "" or len(haystack.split(needle)) == 1:
            return -1
        return len(haystack.split(needle)[0])
def nextPermutation(nums):
    """
    :type nums: List[int]
    :rtype: void Do not return anything, modify nums in-place instead.
    """
    if not nums: return nums
    l = len(nums)
    i, j = l-2, l-1
    while i>=0 and nums[i] >= nums[i+1]:
        i -= 1
    while j >i and nums[j] <= nums[i]:
        j -= 1
    nums[i], nums[j] = nums[j], nums[i]
    nums[i+1:] = sorted(nums[i+1:])

放一张动画图片更好理解


来自 lettcode
# 利用二分查找 注意链式比较
def search(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: int
    """
    lo, hi = 0, len(nums)-1
    while lo < hi:
        mid = (lo+hi) / 2
        if nums[mid] == target:
            return mid
        if nums[lo] < nums[mid]:
            if nums[lo] <= target <= nums[mid]:
                hi = mid - 1
            else:
                lo = mid +1
        else:
            if nums[mid] <= target <= nums[hi]:
                low = mid+1
            else:
                high = mid - 1
    return -1
# 它是 O(n) 级别的
def searchRange(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """
    # 从左边开始,先找出第一个下标
    for i in range(len(nums)):
        if nums[i] == target:
            left_idx = i
            break
    else:
        return [-1, -1]
    # 从右边开始找出 第一个下标
    for j in range(len(nums)-1, -1, -1):
        if nums[j] == target:
            right_idx = j
            break
    return [left_idx, right_idx]

可以使用 bisect 模块

import bisect
def search_range(nums, target):
    lo = bisect.bisect_left(nums, target)
    return [lo, bisect.bisect(nums, target)-1] if target in nums[lo:lo+1] else [-1, -1]
def searchInsert(self, nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: int
    """
    import bisect
    a = bisect.bisect(nums, target)
    if nums[a-1] == target:
        return a-1
    else:
        return a
    # 一句代码
    # return len([x for x in nums if x<target])
上一篇 下一篇

猜你喜欢

热点阅读