夜雨聆风学习资料网

ARTICLE · 1110452

2026网安习题大全(9)

2026网安习题大全(9)

题目81:多数元素 II

问题描述:给定一个大小为 n 的整数数组 nums,找出其中所有出现次数超过 ⌊n / 3⌋ 的元素。

解题思路:使用摩尔投票法的扩展版本。最多只有两个元素的出现次数超过 n/3。维护两个候选元素 cand1、cand2 和对应的计数器 count1、count2,第一遍遍历选出候选,第二遍遍历验证候选是否满足条件。

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

def majorityElement(nums):    cand1 = cand2 = None    count1 = count2 = 0    for num in nums:        if num == cand1:            count1 += 1        elif num == cand2:            count2 += 1        elif count1 == 0:            cand1, count1 = num, 1        elif count2 == 0:            cand2, count2 = num, 1        else:            count1 -= 1            count2 -= 1    result = []    for cand in (cand1, cand2):        if cand is not None and nums.count(cand) > len(nums) // 3:            if cand not in result:                result.append(cand)    return result


题目82:除自身以外数组的乘积

问题描述:给定一个整数数组 nums,返回一个数组 answer,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。要求不使用除法,且时间复杂度为 O(n)。

解题思路:使用前缀积和后缀积。先从左到右遍历,计算每个位置左侧所有元素的乘积存入结果数组;再从右到左遍历,用一个变量维护右侧所有元素的乘积,与结果数组中对应位置相乘得到最终结果。

Python 代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

def productExceptSelf(nums):    n = len(nums)    answer = [1] * n    left = 1    for i in range(n):        answer[i] = left        left *= nums[i]    right = 1    for i in range(n - 1, -1, -1):        answer[i] *= right        right *= nums[i]    return answer


题目83:递增的三元子序列

问题描述:给定一个整数数组 nums,判断这个数组中是否存在长度为 3 的递增子序列。

解题思路:使用贪心算法。维护两个变量 first 和 second,分别表示当前找到的最小元素和第二小元素。遍历数组,若当前元素大于 second,则找到了递增三元组;若大于 first 则更新 second;否则更新 first。

Python 代码示例:

1
2
3
4
5
6
7
8
9
10
11
12

def increasingTriplet(nums):    first = second = float('inf')    for num in nums:        if num <= first:            first = num        elif num <= second:            second = num        else:            return True    return False


题目84:螺旋矩阵 II

问题描述:给定一个正整数 n,生成一个包含 1 到 n² 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵。

解题思路:模拟螺旋填充过程。定义四个边界 top、bottom、left、right,按照右、下、左、上的顺序依次填入数字,每填完一条边就收缩对应边界,直到填满所有位置。

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
26
27
28
29
30

def generateMatrix(n):    matrix = [[0] * n for _ in range(n)]    top, bottom = 0, n - 1    left, right = 0, n - 1    num = 1    while top <= bottom and left <= right:        for c in range(left, right + 1):            matrix[top][c] = num            num += 1        top += 1        for r in range(top, bottom + 1):            matrix[r][right] = num            num += 1        right -= 1        if top <= bottom:            for c in range(right, left - 1, -1):                matrix[bottom][c] = num                num += 1            bottom -= 1        if left <= right:            for r in range(bottom, top - 1, -1):                matrix[r][left] = num                num += 1            left += 1    return matrix


题目85:旋转图像

问题描述:给定一个 n x n 的二维矩阵 matrix 表示一个图像,将图像顺时针旋转 90 度。要求原地旋转,不能使用另一个矩阵。

解题思路:分两步完成:先沿主对角线(从左上到右下)翻转矩阵,即交换 matrix[i][j] 和 matrix[j][i];然后翻转每一行,即交换 matrix[i][j] 和 matrix[i][n-1-j]。两步完成后即为顺时针旋转 90 度的结果。

Python 代码示例:

1
2
3
4
5
6
7
8
9
10
11
12

def rotate(matrix):    n = len(matrix)    # 沿主对角线翻转    for i in range(n):        for j in range(i + 1, n):            matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]    # 翻转每一行    for i in range(n):        for j in range(n // 2):            matrix[i][j], matrix[i][n - 1 - j] = matrix[i][n - 1 - j], matrix[i][j]

题目86:生命游戏

问题描述:给定一个 m x n 的二维网格 board,每个格子中的细胞可以是活细胞(1)或死细胞(0)。根据康威生命游戏的规则,同时更新所有细胞的状态:

  • • 活细胞周围活细胞少于 2 个或超过 3 个则死亡;
  • • 死细胞周围恰好有 3 个活细胞则复活。

要求原地更新。

解题思路:用额外的状态值表示中间状态:-1 表示原本活但变为死,2 表示原本死但变为活。遍历每个细胞统计周围 8 个邻居中活细胞数量(绝对值等于 1),根据规则标记中间状态。最后再遍历一次将中间状态转换为最终状态。

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
26
27
28
29
30
31

def gameOfLife(board):    if not board:        return    rows, cols = len(board), len(board[0])    def count_live(r, c):        count = 0        for dr in (-1, 0, 1):            for dc in (-1, 0, 1):                if dr == 0 and dc == 0:                    continue                nr, nc = r + dr, c + dc                if 0 <= nr < rows and 0 <= nc < cols and abs(board[nr][nc]) == 1:                    count += 1        return count    for r in range(rows):        for c in range(cols):            live = count_live(r, c)            if board[r][c] == 1 and (live < 2 or live > 3):                board[r][c] = -1            elif board[r][c] == 0 and live == 3:                board[r][c] = 2    for r in range(rows):        for c in range(cols):            if board[r][c] == -1:                board[r][c] = 0            elif board[r][c] == 2:                board[r][c] = 1


题目87:加一

问题描述:给定一个由整数组成的非空数组 digits,表示一个非负整数。在该数的基础上加一,返回结果数组。最高位数字存放在数组的首位。

解题思路:从数组末尾开始遍历,若当前位小于 9 则直接加一并返回;若当前位为 9 则置为 0 并继续向前处理。若所有位都是 9,则需要在数组开头插入一个 1。

Python 代码示例:

1
2
3
4
5
6
7
8

def plusOne(digits):    for i in range(len(digits) - 1, -1, -1):        if digits[i] < 9:            digits[i] += 1            return digits        digits[i] = 0    return [1] + digits


题目88:二进制求和

问题描述:给定两个二进制字符串 a 和 b,以二进制字符串的形式返回它们的和。

解题思路:从两个字符串的末尾开始逐位相加,使用进位变量 carry。每一位的和为 carry + a 的当前位 + b 的当前位,结果的当前位为和对 2 取余,进位为和对 2 整除。最后若仍有进位则补上。

Python 代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

def addBinary(a, b):    i, j = len(a) - 1, len(b) - 1    carry = 0    result = []    while i >= 0 or j >= 0 or carry:        total = carry        if i >= 0:            total += int(a[i])            i -= 1        if j >= 0:            total += int(b[j])            j -= 1        result.append(str(total % 2))        carry = total // 2    return ''.join(reversed(result))


题目89:最后一个单词的长度

问题描述:给定一个字符串 s,由若干单词组成,单词之间用空格分隔。返回字符串中最后一个单词的长度。如果不存在最后一个单词,返回 0。

解题思路:先从字符串末尾跳过所有空格,然后从最后一个非空格字符开始向前统计字符数量,直到遇到空格或到达字符串开头。

Python 代码示例:

1
2
3
4
5
6
7
8
9
10
11
12

def lengthOfLastWord(s):    i = len(s) - 1    while i >= 0 and s[i] == ' ':        i -= 1    length = 0    while i >= 0 and s[i] != ' ':        length += 1        i -= 1    return length


题目90:有效的字母异位词

问题描述:给定两个字符串 s 和 t,编写一个函数来判断 t 是否是 s 的字母异位词。字母异位词指由相同字母重新排列形成的字符串。

解题思路:若两个字符串长度不同则直接返回 False。使用长度为 26 的计数数组,遍历 s 时对对应位置加一,遍历 t 时对对应位置减一。最终若计数数组中所有元素都为 0,则互为字母异位词。

Python 代码示例:

1
2
3
4
5
6
7
8
9
10
11
12

def isAnagram(s, t):    if len(s) != len(t):        return False    count = [0] * 26    for ch in s:        count[ord(ch) - ord('a')] += 1    for ch in t:        count[ord(ch) - ord('a')] -= 1    return all(c == 0 for c in count)

相关学习资料