夜雨聆风学习资料网

ARTICLE · 1059012

2026网安习题大全(2)

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

相关学习资料