100个python代码大全

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

解题思路:使用哈希表。遍历数组,对于每个元素,检查 target - nums[i] 是否已经存在于哈希表中,若存在则返回两数的下标,否则将当前元素存入哈希表。

Python代码示例:

def twoSum(nums, target):
    hashmap = {}
    for i, num in enumerate(nums):
        complement = target - num
        if complement in hashmap:
            return [hashmap[complement], i]
        hashmap[num] = i
    return []

题目2:反转字符串

问题描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组形式给出。

解题思路:双指针法。设置两个指针分别指向字符串的首尾,交换两指针对应的字符,直到两指针相遇。

Python代码示例:

def reverseString(s):
    left, right = 0, len(s) - 1
    while left < right:
        s[left], s[right] = s[right], s[left]
        left, right = left + 1, right - 1
    return s

题目3:无重复字符的最长子串

问题描述:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

解题思路:滑动窗口。使用两个指针定义一个窗口,不断移动右指针扩大窗口,同时用哈希表记录窗口内字符出现情况,当窗口内有重复字符时,移动左指针缩小窗口。

Python代码示例:

def lengthOfLongestSubstring(s):
    char_map = {}
    left, max_len = 0, 0
    for right, char in enumerate(s):
        if char in char_map and char_map[char] >= left:
            left = char_map[char] + 1
        char_map[char] = right
        max_len = max(max_len, right - left + 1)
    return max_len

题目4:合并两个有序链表

问题描述:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

解题思路:迭代或递归。迭代法中,创建一个哑节点作为新链表的头,然后比较两个链表的节点值,将较小的节点接到新链表上,直到一个链表为空,再将另一个链表剩下的部分接到新链表后面。

Python代码示例:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def mergeTwoLists(l1, l2):
    dummy = ListNode()
    tail = dummy
    while l1 and l2:
        if l1.val < l2.val:
            tail.next, l1 = l1, l1.next
        else:
            tail.next, l2 = l2, l2.next
        tail = tail.next
    tail.next = l1 or l2
    return dummy.next

题目5:最长公共前缀

问题描述:编写一个函数来查找字符串数组中的最长公共前缀。

解题思路:水平扫描。依次比较每个字符串同一位置的字符,直到找到第一个不匹配的字符或遍历完最短的字符串。

Python代码示例:

def longestCommonPrefix(strs):
    if not strs:
        return ""
    prefix = strs[0]
    for s in strs[1:]:
        while s[:len(prefix)] != prefix and prefix:
            prefix = prefix[:len(prefix)-1]
    return prefix

题目6:跳跃游戏

问题描述:给定一个非负整数数组,你最初位于数组的第一个位置,数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。

解题思路:贪心算法。维护一个变量来跟踪当前能到达的最远位置,逐步向前推进。

Python代码示例:

def canJump(nums):
    max_reach = 0
    for i in range(len(nums)):
        if i > max_reach:
            return False
        max_reach = max(max_reach, i + nums[i])
        if max_reach >= len(nums) - 1:
            return True
    return False

题目7:最长递增子序列

问题描述:给定一个无序的整数数组,找到其中最长递增子序列的长度。

解题思路:动态规划。维护一个数组 dp,其中 dp[i] 表示以 nums[i] 结尾的最长递增子序列的长度。

Python代码示例:

def lengthOfLIS(nums):
    if not nums:
        return 0
    dp = [1] * len(nums)
    for i in range(len(nums)):
        for j in range(i):
            if nums[i] > nums[j]:
                dp[i] = max(dp[i], dp[j] + 1)
    return max(dp)

题目8:合并K个排序链表

问题描述:给定一个链表数组,每个链表都是升序排列的,将所有链表合并成一个升序链表并返回。

解题思路:分治法或优先队列。可以用优先队列(堆)每次取出当前链表中的最小值节点,连接到结果链表上。

Python代码示例:

import heapq

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def mergeKLists(lists):
    dummy = ListNode()
    current = dummy
    heap = []

    for head in lists:
        if head:
            heapq.heappush(heap, (head.val, head))

    while heap:
        val, node = heapq.heappop(heap)
        current.next = ListNode(val)
        current = current.next
        if node.next:
            heapq.heappush(heap, (node.next.val, node.next))

    return dummy.next

题目9:回文链表

问题描述:判断一个链表是否是回文链表。

解题思路:快慢指针找到中点,然后反转后半部分链表,最后比较前后两半是否相等。

Python代码示例:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def isPalindrome(head):
    slow, fast = head, head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
    second_half = reverseList(slow)
    first_half_iter = head
    while second_half:
        if first_half_iter.val != second_half.val:
            return False
        first_half_iter = first_half_iter.next
        second_half = second_half.next
    return True

def reverseList(head):
    prev, curr = None, head
    while curr:
        next_temp = curr.next
        curr.next = prev
        prev = curr
        curr = next_temp
    return prev

题目10:最长连续序列

问题描述:给定一个未排序的整数数组,找出最长连续序列的长度。

解题思路:哈希表。遍历数组,使用哈希表记录每个数字出现的情况,然后检查每个数字的连续性。

Python代码示例:

def longestConsecutive(nums):
    num_set = set(nums)
    longest_streak = 0

    for num in num_set:
        if num - 1 not in num_set:
            current_num = num
            current_streak = 1

            while current_num + 1 in num_set:
                current_num += 1
                current_streak += 1

            longest_streak = max(longest_streak, current_streak)

    return longest_streak

题目11:岛屿数量

问题描述:给定一个二维网格地图,’1′ 表示陆地,’0′ 表示水域,计算岛屿的数量。一个岛屿是由四面相连的陆地组成,水平或垂直相邻。

解题思路:深度优先搜索(DFS)。遍历网格,遇到陆地(’1’)时,进行DFS标记已访问过的陆地为水域,以避免重复计数。

Python代码示例:

def numIslands(grid):
    def dfs(i, j):
        if 0 <= i < len(grid) and 0 <= j < len(grid[0]) and grid[i][j] == '1':
            grid[i][j] = '0'
            dfs(i + 1, j)
            dfs(i - 1, j)
            dfs(i, j + 1)
            dfs(i, j - 1)

    count = 0
    for i in range(len(grid)):
        for j in range(len(grid[0])):
            if grid[i][j] == '1':
                dfs(i, j)
                count += 1
    return count

题目12:括号生成

问题描述:给定一个整数 n,生成所有可能的由 n 对括号组成的合法组合。

解题思路:回溯算法。递归生成括号序列,每次添加左括号或右括号时确保序列保持合法性(左括号数量大于等于右括号数量)。

Python代码示例:

def generateParenthesis(n):
    def backtrack(left, right, path, res):
        if left == right == 0:
            res.append(path)
            return
        if left > 0:
            backtrack(left - 1, right, path + '(', res)
        if right > left:
            backtrack(left, right - 1, path + ')', res)

    res = []
    backtrack(n, n, '', res)
    return res

题目13:子集

问题描述:给定一个整数数组 nums ,返回所有可能的子集(幂集)。

解题思路:回溯算法。通过递归遍历数组,对于每个元素都有两种选择(选或不选),构建所有可能的子集。

Python代码示例:

def subsets(nums):
    def backtrack(start, path):
        res.append(path[:])
        for i in range(start, len(nums)):
            path.append(nums[i])
            backtrack(i + 1, path)
            path.pop()

    res = []
    nums.sort()
    backtrack(0, [])
    return res

题目14:最接近的三数之和

问题描述:给定一个包括 n 个整数的数组 nums 和一个目标值 target,找出 nums 中和为目标值的那三个整数,返回这三个数的和。你可以假设每组输入只对应唯一的解,且同样的元素不能被重复利用。

解题思路:排序 + 双指针。首先对数组进行排序,然后遍历数组,固定一个数,使用双指针对剩下的数进行搜索,找到最接近目标值的三数之和。

Python代码示例:

def threeSumClosest(nums, target):
    nums.sort()
    closest_sum = float('inf')
    for i in range(len(nums) - 2):
        left, right = i + 1, len(nums) - 1
        while left < right:
            current_sum = nums[i] + nums[left] + nums[right]
            if abs(target - current_sum) < abs(target - closest_sum):
                closest_sum = current_sum
            if current_sum < target:
                left += 1
            else:
                right -= 1
    return closest_sum

题目15:最大子序和

问题描述:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

解题思路:动态规划。使用一个变量记录当前子数组的最大和以及全局最大和,遍历数组更新这两个值。

Python代码示例:

def maxSubArray(nums):
    current_max = global_max = nums[0]
    for num in nums[1:]:
        current_max = max(num, current_max + num)
        global_max = max(global_max, current_max)
    return global_max

题目16:合并两个有序链表

问题描述:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

解题思路:迭代或递归。创建一个哑节点作为新链表的起点,比较两个链表的节点值,将较小的节点接到新链表上,然后移动对应链表的指针。

Python代码示例(迭代法):

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def mergeTwoLists(l1, l2):
    dummy = ListNode()
    current = dummy
    while l1 and l2:
        if l1.val < l2.val:
            current.next = l1
            l1 = l1.next
        else:
            current.next = l2
            l2 = l2.next
        current = current.next
    current.next = l1 or l2
    return dummy.next

题目17:二叉树的最近公共祖先

问题描述:给定一个二叉树,找到该树中两个指定节点的最近公共祖先。

解题思路:从根节点开始递归,如果当前节点是p或q中的任意一个,或者当前节点的左右子树分别包含了p和q,则当前节点就是最近公共祖先。

Python代码示例:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def lowestCommonAncestor(root, p, q):
    if not root or root == p or root == q:
        return root
    left = lowestCommonAncestor(root.left, p, q)
    right = lowestCommonAncestor(root.right, p, q)
    return root if left and right else (left or right)

题目18:最长公共前缀

问题描述:编写一个函数来查找字符串数组中的最长公共前缀。

解题思路:横向扫描。比较字符串数组中每个字符串的相同位置字符,直到出现不匹配为止。

Python代码示例:

def longestCommonPrefix(strs):
    if not strs:
        return ""
    prefix, count = strs[0], len(strs)
    for i in range(1, count):
        prefix = prefix[:min(len(prefix), len(strs[i]))]
        for j in range(len(prefix)):
            if prefix[j] != strs[i][j]:
                prefix = prefix[:j]
                break
        if not prefix:
            break
    return prefix

题目19:多数元素

问题描述:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 n/2 的元素。

解题思路:摩尔投票法。维护一个候选元素及其计数,遍历数组,如果遇到与候选元素相同的就增加计数,不同则减少计数。当计数为0时,更换候选元素。

Python代码示例:

def majorityElement(nums):
    candidate, count = 0, 0
    for num in nums:
        if count == 0:
            candidate = num
        count += (1 if num == candidate else -1)
    return candidate

题目20:ZigZag Conversion

问题描述:将一个给定字符串根据给定的行数,以从上往下、从左到右的方式 ZigZag 地排列成新的字符串。

解题思路:模拟。按行构建结果字符串,注意当到达每一行的边界时改变方向。

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/78960.html

(0)
guozi's avatarguozi
上一篇 2024年5月30日 下午3:03
下一篇 2024年5月30日 下午3:08

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注