1. 给定一个列表,如何找到其中最大的三个数?
lst = [10, 50, 30, 70, 20, 90, 80, 40, 60]

# 方法1:使用sorted函数
print(sorted(lst)[-3:])

# 方法2:使用堆排序
import heapq
print(heapq.nlargest(3, lst))
  1. 将一个整数转换为罗马数字。
def int_to_roman(num: int) -> str:
    roman_map = {1: 'I', 4: 'IV', 5: 'V', 9: 'IX', 10: 'X', 40: 'XL', 50: 'L', 90: 'XC', 100: 'C',
                 400: 'CD', 500: 'D', 900: 'CM', 1000: 'M'}
    result = ''
    for value, symbol in sorted(roman_map.items(), reverse=True):
        while num >= value:
            result += symbol
            num -= value
    return result

print(int_to_roman(1994))
  1. 给出一个字符串,找到其中第一个不重复的字符。
def first_non_repeating_char(s: str) -> str:
    from collections import Counter
    counter = Counter(s)
    for char in s:
        if counter[char] == 1:
            return char
    return None

print(first_non_repeating_char('leetcode'))
  1. 给定两个整数数组,找到它们的交集。
def intersection(nums1, nums2):
    set1 = set(nums1)
    set2 = set(nums2)
    return list(set1 & set2)

print(intersection([1,2,2,1], [2,2]))
  1. 给定一个字符串,找到其中最长的回文子串。
def longest_palindrome(s: str) -> str:
    n = len(s)
    if n < 2:
        return s
    start, max_len = 0, 1
    for i in range(n):
        l, r = i, i
        while r < n-1 and s[r] == s[r+1]:
            r += 1
        while l > 0 and r < n-1 and s[l-1] == s[r+1]:
            l -= 1
            r += 1
        if r-l+1 > max_len:
            max_len = r-l+1
            start = l
    return s[start:start+max_len]

print(longest_palindrome('babad'))
  1. 给定一个字符串,找到其中最长的无重复字符子串。
def longest_substring(s: str) -> int:
    n = len(s)
    max_len = 0
    start = 0
    d = {}
    for i in range(n):
        if s[i] in d and d[s[i]] >= start:
            start = d[s[i]] + 1
        d[s[i]] = i
        max_len = max(max_len, i-start+1)
    return max_len

print(longest_substring('abcabcbb'))
  1. 实现一个LRU缓存。
class LRUCache:
    def __init__(self, capacity: int):
        self.capacity = capacity
        self.cache = {}
        self.keys = []

    def get(self, key: int) -> int:
        if key in self.cache:
            self.keys.remove(key)
            self.keys.append(key)
            return self.cache[key]
        return -1

    def put(self, key: int, value: int) -> None:
        if key in self.cache:
            self.keys.remove(key)
        elif len(self.cache) >= self.capacity:
            oldest = self.keys.pop(0)
            del self.cache[oldest]
        self.cache[key] = value
        self.keys.append(key)
  1. 给定一个字符串,找到其中出现次数最多的字符和次数。
def most_common_char(s: str) -> tuple:
    from collections import Counter
    counter = Counter(s)
    return counter.most_common(1)[0]

print(most_common_char('leetcode'))
  1. 实现一个二叉树的前序遍历。
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def preorder_traversal(root: TreeNode) -> List[int]:
    if not root:
        return []
    stack = [root]
    res = []
    while stack:
        node = stack.pop()
        res.append(node.val)
        if node.right:
            stack.append(node.right)
        if node.left:
            stack.append(node.left)
    return res
  1. 实现一个二叉树的中序遍历。
def inorder_traversal(root: TreeNode) -> List[int]:
    stack = []
    res = []
    while stack or root:
        while root:
            stack.append(root)
            root = root.left
        node = stack.pop()
        res.append(node.val)
        root = node.right
    return res
  1. 给定一个排序数组,将其转换为二叉搜索树。
def sorted_array_to_bst(nums: List[int]) -> TreeNode:
    if not nums:
        return None
    mid = len(nums) // 2
    root = TreeNode(nums[mid])
    root.left = sorted_array_to_bst(nums[:mid])
    root.right = sorted_array_to_bst(nums[mid+1:])
    return root
  1. 给定两个字符串,判断它们是否互为变位词。
def is_anagram(s: str, t: str) -> bool:
    if len(s) != len(t):
        return False
    counter = [0] * 26
    for i in range(len(s)):
        counter[ord(s[i]) - ord('a')] += 1
        counter[ord(t[i]) - ord('a')] -= 1
    return all(x == 0 for x in counter)

print(is_anagram('anagram', 'nagaram'))
  1. 给定一个二叉树,判断它是否是平衡二叉树。
def is_balanced(root: TreeNode) -> bool:
    def height(node):
        if not node:
            return 0
        left_height = height(node.left)
        right_height = height(node.right)
        if left_height == -1 or right_height == -1 or abs(left_height - right_height) > 1:
            return -1
        return 1 + max(left_height, right_height)

    return height(root) != -1
  1. 给定一个数组和一个目标值,找到其中两个数的和等于目标值。
def two_sum(nums: List[int], target: int) -> List[int]:
    d = {}
    for i, num in enumerate(nums):
        if target - num in d:
            return [d[target - num], i]
        d[num] = i
    return None

print(two_sum([2, 7, 11, 15], 9))
  1. 实现一个堆排序。
def heap_sort(nums: List[int]) -> List[int]:
    def heapify(nums, n, i):
        largest = i
        left = 2*i + 1
        right = 2*i + 2
        if left < n and nums[left] > nums[largest]:
            largest = left
        if right < n and nums[right] > nums[largest]:
            largest = right
        if largest != i:
            nums[i], nums[largest] = nums[largest], nums[i]
            heapify(nums, n, largest)
    
    n = len(nums)
    for i in range(n//2 - 1, -1, -1):
        heapify(nums, n, i)
    for i in range(n-1, 0, -1):
        nums[0], nums[i] = nums[i], nums[0]
        heapify(nums, i, 0)
    return nums

print(heap_sort([3, 2, 1, 5, 4]))
  1. 实现一个快速排序。
def quick_sort(nums: List[int]) -> List[int]:
    if len(nums) <= 1:
        return nums
    pivot = nums[0]
    left = [x for x in nums[1:] if x < pivot]
    right = [x for x in nums[1:] if x >= pivot]
    return quick_sort(left) + [pivot] + quick_sort(right)

print(quick_sort([3, 2, 1, 5, 4]))
  1. 实现一个归并排序。
def merge_sort(nums: List[int]) -> List[int]:
    if len(nums) <= 1:
        return nums
    mid = len(nums) // 2
    left = merge_sort(nums[:mid])
    right = merge_sort(nums[mid:])
    return merge(left, right)

def merge(left, right):
    res = []
    i, j = 0, 0
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            res.append(left[i])
            i += 1
        else:
            res.append(right[j])
            j += 1
    res.extend(left[i:])
    res.extend(right[j:])
    return res

print(merge_sort([3, 2, 1, 5, 4]))
  1. 实现一个希尔排序。
def shell_sort(nums: List[int]) -> List[int]:
    n = len(nums)
    gap = n // 2
    while gap > 0:
        for i in range(gap, n):
            temp = nums[i]
            j = i
            while j >= gap and nums[j-gap] > temp:
                nums[j] = nums[j-gap]
                j -= gap
            nums[j] = temp
        gap = gap // 2
    return nums

print(shell_sort([3, 2, 1, 5, 4]))
  1. 实现一个基数排序。
def radix_sort(nums: List[int]) -> List[int]:
    def counting_sort(nums, exp):
        n = len(nums)
        output = [0] * n
        count = [0] * 10
        for i in range(n):
            index = nums[i] // exp
            count[index % 10] += 1
        for i in range(1, 10):
            count[i] += count[i-1]
        for i in range(n-1, -1, -1):
            index = nums[i] // exp
            output[count[index % 10] - 1] = nums[i]
            count[index % 10] -= 1
        nums[:] = output[:]
    
    max_num = max(nums)
    exp = 1
    while max_num // exp > 0:
        counting_sort(nums, exp)
        exp *= 10
    return nums

print(radix_sort([3, 2, 1, 5, 4]))
  1. 实现一个二分查找。
def binary_search(nums: List[int], target: int) -> int:
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

print(binary_search([1, 2, 3, 4, 5], 3))
给出20个有点难度的python题目以及答案

原文地址: https://www.cveoy.top/t/topic/bL3e 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录