100个python代码大全(非常详细)零基础入门到精通,收藏这一篇就够了

时间:2024-11-08 19:26:48

题目1:两数之和

问题描述:给定一个整数数组 nums 和一个目标值 target,找出数组中和为目标值的两个数的下标。

解题思路:使用哈希表记录每个值及其索引,遍历数组时查找目标值与当前值的差是否在哈希表中。

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:买卖股票的最佳时机

问题描述:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格,设计一个算法来找到最大的可能利润,你可以尽可能地完成最多两次交易(一次买入和一次卖出)。

解题思路:动态规划,定义四个变量分别记录第一次买入、第一次卖出、第二次买入和第二次卖出的最大利润。

Python代码示例:

def maxProfit(prices):
    buy1, buy2, profit1, profit2 = float('inf'), float('inf'), 0, 0
    for price in prices:
        buy1 = min(buy1, price)
        profit1 = max(profit1, price - buy1)
        buy2 = min(buy2, price - profit1)
        profit2 = max(profit2, price - buy2)
    return profit2

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

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

解题思路:滑动窗口,用两个指针分别表示窗口的左右边界,维护一个哈希集合记录窗口内的字符,窗口右移时检查字符是否重复,重复则左指针右移。

Python代码示例:

def lengthOfLongestSubstring(s):
    char_set = set()
    left, right, max_len = 0, 0, 0
    while right < len(s):
        if s[right] not in char_set:
            char_set.add(s[right])
            max_len = max(max_len, right - left + 1)
            right += 1
        else:
            char_set.remove(s[left])
            left += 1
    return max_len

题目4:岛屿数量

问题描述:给定一个由 ‘1’(陆地)和 ‘0’(水)组成的二维网格地图,计算岛屿的数量。

解题思路:深度优先搜索,遍历地图,遇到 ‘1’ 则进行 DFS 并标记为 ‘0’ 避免重复计数。

Python代码示例:

def numIslands(grid):
    def dfs(i, j):
        if i < 0 or j < 0 or i >= len(grid) or j >= len(grid[0]) or grid[i][j] != '1':
            return
        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

题目5:最长公共前缀

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

解题思路:水平扫描,比较每个字符串的相同位置的字符,直到遇到不匹配或遍历完所有字符串的最短长度。

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]))]
        while prefix and strs[i].find(prefix) != 0:
            prefix = prefix[:-1]
    return prefix

题目6:括号生成

问题描述:给定一个整数 n,生成所有合法的括号组合,如 n=3,输出 ["((()))","(()())","(())()","()(())","()()()"]

解题思路:回溯法,递归生成所有可能的组合,同时保证左括号数量不超过右括号数量。

Python代码示例:

def generateParenthesis(n):
    def backtrack(openN, closeN, path, result):
        if openN == closeN == n:
            ("".join(path))
            return
        if openN < n:
            ("(")
            backtrack(openN + 1, closeN, path, result)
            ()
        if closeN < openN:
            (")")
            backtrack(openN, closeN + 1, path, result)
            ()
    
    result = []
    backtrack(0, 0, [], result)
    return result

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

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

解题思路:迭代法,创建哑节点作为新链表的起点,比较两个链表的节点值,将较小值的节点添加到新链表,并移动对应链表的指针。

Python代码示例:

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

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

题目8:多数元素

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

解题思路:摩尔投票法,使用一个候选人变量和计数器,遍历数组,不断更新候选人和计数器。

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

题目9:最长回文子串

问题描述:给定一个字符串 s,找到它的最长回文子串。

解题思路:动态规划,用二维数组 dp 记录字符串中各个子串是否为回文,基于已知状态推导未知状态。

Python代码示例:

def longestPalindrome(s):
    if not s:
        return ""
    n = len(s)
    dp = [[False]*n for _ in range(n)]
    max_len = 1
    start = 0
    for i in range(n):
        dp[i][i] = True
    for length in range(2, n+1):
        for i in range(n-length+1):
            j = i + length - 1
            if s[i] == s[j] and (length == 2 or dp[i+1][j-1]):
                dp[i][j] = True
                if length > max_len:
                    max_len = length
                    start = i
    return s[start:start+max_len]

题目10:子集

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

解题思路:回溯法,递归构建子集,对于每个元素都有两种选择:包含或不包含。

Python代码示例:

def subsets(nums):
    def backtrack(start, path):
        (path[:])
        for i in range(start, len(nums)):
            (nums[i])
            backtrack(i+1, path)
            ()
    
    result = []
    ()
    backtrack(0, [])
    return result

题目11:岛屿数量

问题描述:给定一个由 ‘1’(陆地)和 ‘0’(水)组成的二维网格地图,计算岛屿的数量。岛屿是由水平或垂直方向相邻的陆地连接而成的,你可以假设网格的四个边缘都被水包围。

解题思路:深度优先搜索(DFS)或广度优先搜索(BFS),遍历网格,遇到陆地就进行深度遍历标记为已访问,计数加一。

Python代码示例 (DFS):

def dfs(grid, i, j):
    if i < 0 or j < 0 or i >= len(grid) or j >= len(grid[0]) or grid[i][j] != '1':
        return
    grid[i][j] = '0'
    dfs(grid, i + 1, j)
    dfs(grid, i - 1, j)
    dfs(grid, i, j + 1)
    dfs(grid, i, j - 1)

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

题目12:最大子序列和

问题描述:给定一个整数数组 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

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

问题描述:给定一个字符串 s,找出无重复字符的最长子串长度。

解题思路:滑动窗口,使用两个指针表示窗口的左右边界,同时用集合记录当前窗口内的字符,当遇到重复字符时,左指针向右移动一位,移除重复字符,直到没有重复为止,过程中记录最长无重复子串长度。

Python代码示例:

def lengthOfLongestSubstring(s):
    char_set = set()
    left, right, max_length = 0, 0, 0
    while right < len(s):
        if s[right] not in char_set:
            char_set.add(s[right])
            max_length = max(max_length, right - left + 1)
            right += 1
        else:
            char_set.remove(s[left])
            left += 1
    return max_length

题目14:二叉树的中序遍历

问题描述:给定一个二叉树的根节点,返回该二叉树的中序遍历结果。

解题思路:递归或迭代,递归方法较为直观,直接按照“左根右”的顺序访问节点。

Python代码示例 (递归):

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

def inorderTraversal(root):
    result = []
    def dfs(node):
        if node:
            dfs()
            ()
            dfs()
    dfs(root)
    return result

题目15:最小堆实现

问题描述:实现一个最小堆类,包括插入元素、删除最小元素、获取最小元素的操作。

解题思路:使用列表表示堆结构,插入元素后上浮调整,删除元素后下沉调整,保持堆的性质。

Python代码示例:

class MinHeap:
    def __init__(self):
         = []

    def push(self, val):
        (val)
        self._swim(len() - 1)

    def pop(self):
        if not :
            return None
        root = [0]
        [0] = [-1]
        del [-1]
        self._sink(0)
        return root

    def top(self):
        return [0] if  else None

    def _swim(self, idx):
        parent = (idx - 1) // 2
        while idx > 0 and [parent] > [idx]:
            [parent], [idx] = [idx], [parent]
            idx, parent = parent, (parent - 1) // 2

    def _sink(self, idx):
        child = 2 * idx + 1
        while child < len():
            if child + 1 < len() and [child] > [child + 1]:
                child += 1
            if [child] >= [idx]:
                break
            [child], [idx] = [idx], [child]
            idx, child = child, 2 * child + 1

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

问题描述:合并两个升序排列的链表为一个单一的升序链表。

解题思路:采用虚拟头节点简化操作,双指针法遍历两个链表,比较节点值大小,依次连接到结果链表中。

Python代码示例:

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

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

题目17:三数之和

问题描述:给定一个包含 n 个整数的数组,找出所有和为0的不重复三元组。

解题思路:排序后使用双指针法,固定一个元素,剩下两个元素使用类似两数之和的方法查找。

Python代码示例:

def threeSum(nums):
    ()
    res = []
    for i in range(len(nums) - 2):
        if i > 0 and nums[i] == nums[i - 1]:
            continue
        left, right = i + 1, len(nums) - 1
        while left < right:
            s = nums[i] + nums[left] + nums[right]
            if s < 0:
                left += 1
            elif s > 0:
                right -= 1
            else:
                ([nums[i], nums[left], nums[right]])
                while left < right and nums[left] == nums[left + 1]:
                    left += 1
                while left < right and nums[right] == nums[right - 1]:
                    right -= 1
                left, right = left + 1, right - 1
    return res

题目18:最长公共前缀

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

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

Python代码示例:

def longestCommonPrefix(strs):
    if not strs:
        return ""
    for i, char in enumerate(zip(*strs)):
        if len(set(char)) > 1:
            return strs[0][:i]
    return min(strs, key=len)

题目19:括号生成

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

解题思路:回溯法,递归生成所有可能的组合,同时保证左括号数量不大于右括号数量。

Python代码示例:

def generateParenthesis(n):
    def backtrack(openN, closeN, path, result):
        if openN == closeN == n:
            ("".join(path))
            return
        if openN < n:
            ("(")
            backtrack(openN + 1, closeN, path, result)
            ()
        if closeN < openN:
            (")")
            backtrack(openN, closeN + 1, path, result)
            ()
    
    result = []
    backtrack(0, 0, [], result)
    return result

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

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

解题思路:从根节点开始递归,如果当前节点是p或q,则返回当前节点;如果左右子树分别找到了p和q,则返回当前节点;如果只有一边找到了p或q,则继续在另一边找。

Python代码示例:

class TreeNode:
    def __init__(self, x):
         = x
         = None
         = None

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

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

****大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

****大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

****大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、****等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

****大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享