ARTICLE · 1059012
2026网安习题大全(2)
题目11:反转字符串中的单词
问题描述:给定一个字符串 s,反转其中单词的顺序。单词之间以空格分隔,反转后单词之间只保留一个空格,且首尾不能有空格。
解题思路:先按空格切分字符串,过滤掉空字符串,然后反转列表,最后用单个空格拼接。
Python 代码示例:
1 2 3 def reverseWords(s): words = s.split() return ' '.join(reversed(words))
题目12:环形链表
问题描述:给定一个链表,判断链表中是否有环。如果链表中有某个节点可以通过连续跟踪 next 指针再次到达,则链表中存在环。
解题思路:使用快慢指针。慢指针每次走一步,快指针每次走两步。如果存在环,快指针最终会追上慢指针;如果快指针到达链表末尾,则不存在环。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 def hasCycle(head): slow = fast = head while fast and fast.next: slow = slow.next fast = fast.next.next if slow == fast: return True return False
题目13:课程表
问题描述:给定课程总数 numCourses 和先修课程列表 prerequisites,判断是否可能完成所有课程。例如 prerequisites[i] = [a, b] 表示学习课程 a 之前必须先学习课程 b。
解题思路:将问题转化为有向图判断是否存在环。使用拓扑排序(BFS + 入度表)。统计每个节点的入度,将入度为 0 的节点入队,依次出队并减少相邻节点的入度。若最终出队节点数等于课程总数,则无环,可以完成。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 from collections import dequedef canFinish(numCourses, prerequisites): graph = [[] for _ in range(numCourses)] indegree = [0] * numCourses for a, b in prerequisites: graph[b].append(a) indegree[a] += 1 queue = deque([i for i in range(numCourses) if indegree[i] == 0]) finished = 0 while queue: node = queue.popleft() finished += 1 for nxt in graph[node]: indegree[nxt] -= 1 if indegree[nxt] == 0: queue.append(nxt) return finished == numCourses
题目14:括号生成
问题描述:给定一个整数 n,生成所有由 n 对括号组成的、格式正确的括号组合。
解题思路:使用回溯法。维护当前已使用的左括号数 left 和右括号数 right。当 left < n 时可以添加左括号;当 right < left 时可以添加右括号。当左右括号数都等于 n 时,将当前组合加入结果集。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 def generateParenthesis(n): result = [] def backtrack(path, left, right): if len(path) == 2 * n: result.append(path) return if left < n: backtrack(path + '(', left + 1, right) if right < left: backtrack(path + ')', left, right + 1) backtrack('', 0, 0) return result
题目15:滑动窗口最大值
问题描述:给定一个整数数组 nums 和一个整数 k,返回滑动窗口大小为 k 时,每个窗口中的最大值。
解题思路:使用单调递减双端队列。队列中存储数组下标,保证队列对应的值从队首到队尾递减。遍历数组时,先将队首超出窗口范围的下标移除,再将队尾小于当前元素的下标移除,最后将当前下标入队。当窗口形成后,队首即为当前窗口最大值。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 from collections import dequedef maxSlidingWindow(nums, k): queue = deque() result = [] for i, num in enumerate(nums): while queue and queue[0] < i - k + 1: queue.popleft() while queue and nums[queue[-1]] < num: queue.pop() queue.append(i) if i >= k - 1: result.append(nums[queue[0]]) return result
题目16:最长回文子串
问题描述:给定一个字符串 s,找到 s 中最长的回文子串。
解题思路:使用中心扩展法。遍历每个字符,以该字符为中心向两边扩展,同时考虑奇数长度和偶数长度两种情况,记录最长的回文子串。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 def longestPalindrome(s): if not s: return "" start, end = 0, 0 def expand(left, right): while left >= 0 and right < len(s) and s[left] == s[right]: left -= 1 right += 1 return left + 1, right - 1 for i in range(len(s)): l1, r1 = expand(i, i) l2, r2 = expand(i, i + 1) if r1 - l1 > end - start: start, end = l1, r1 if r2 - l2 > end - start: start, end = l2, r2 return s[start:end + 1]
题目17:相交链表
问题描述:给定两个单链表的头节点 headA 和 headB,找出并返回两个链表相交的起始节点。如果两个链表不相交,返回 None。
解题思路:使用双指针。指针 pA 从 headA 出发,走完 headA 后跳到 headB;指针 pB 从 headB 出发,走完 headB 后跳到 headA。若两链表相交,两指针最终会在相交节点相遇;若不相交,两指针会同时到达 None。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 def getIntersectionNode(headA, headB): if not headA or not headB: return None pA, pB = headA, headB while pA != pB: pA = pA.next if pA else headB pB = pB.next if pB else headA return pA
题目18:矩阵置零
问题描述:给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。要求使用原地算法。
解题思路:利用矩阵的第一行和第一列作为标记。先记录第一行和第一列本身是否含 0,然后遍历其余元素,若为 0 则将对应第一行和第一列的位置置 0。再根据标记将对应行列置 0,最后处理第一行和第一列。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 def setZeroes(matrix): if not matrix: return rows, cols = len(matrix), len(matrix[0]) first_row_zero = any(matrix[0][c] == 0 for c in range(cols)) first_col_zero = any(matrix[r][0] == 0 for r in range(rows)) for r in range(1, rows): for c in range(1, cols): if matrix[r][c] == 0: matrix[r][0] = 0 matrix[0][c] = 0 for r in range(1, rows): for c in range(1, cols): if matrix[r][0] == 0 or matrix[0][c] == 0: matrix[r][c] = 0 if first_row_zero: for c in range(cols): matrix[0][c] = 0 if first_col_zero: for r in range(rows): matrix[r][0] = 0
题目19:电话号码的字母组合
问题描述:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。数字到字母的映射与电话按键相同。
解题思路:使用回溯法。建立数字到字母的映射表,递归处理每一位数字,将当前数字对应的每个字母加入路径,处理下一位,直到路径长度等于输入长度。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 def letterCombinations(digits): if not digits: return [] mapping = { '2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl', '6': 'mno', '7': 'pqrs', '8': 'tuv', '9': 'wxyz' } result = [] def backtrack(index, path): if index == len(digits): result.append(path) return for ch in mapping[digits[index]]: backtrack(index + 1, path + ch) backtrack(0, '') return result
题目20:每日温度
问题描述:给定一个整数数组 temperatures,表示每天的温度。返回一个数组 answer,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果之后都不会升高,则 answer[i] = 0。
解题思路:使用单调递减栈。遍历温度数组,当当前温度大于栈顶索引对应的温度时,弹出栈顶并计算天数差,记录到结果数组中。然后将当前索引入栈。栈中存储的是尚未找到更高温度的天数索引。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 def dailyTemperatures(temperatures): n = len(temperatures) answer = [0] * n stack = [] for i, temp in enumerate(temperatures): while stack and temp > temperatures[stack[-1]]: prev = stack.pop() answer[prev] = i - prev stack.append(i) return answer