夜雨聆风学习资料网

ARTICLE · 1127988

2026网安习题大全(13)

2026网安习题大全(13)

题目21:相对名次

问题描述:给定一个长度为 n 的整数数组 score,其中 score[i] 表示第 i 位运动员的比赛成绩。返回一个字符串数组 answer,其中 answer[i] 表示第 i 位运动员的排名。前三名分别获得 "Gold Medal"、"Silver Medal"、"Bronze Medal",其余名次用数字表示。

解题思路:将成绩与原始索引配对,按成绩降序排序。然后依次为每个成绩分配排名,前三名用奖牌字符串,其余用排名数字。最后按原始索引填入结果数组。

Python 代码示例:

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

def findRelativeRanks(score):    sorted_scores = sorted(enumerate(score), key=lambda x: -x[1])    result = [""] * len(score)    medals = ["Gold Medal", "Silver Medal", "Bronze Medal"]    for rank, (index, _) in enumerate(sorted_scores):        if rank < 3:            result[index] = medals[rank]        else:            result[index] = str(rank + 1)    return result


题目22:完美数

问题描述:对于一个正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为完美数。给定一个整数 num,判断它是否为完美数。

解题思路:若 num <= 1 则返回 False。遍历 2 到 sqrt(num),若 num 能被整除,则将因子和加上 i 和 num // i(注意避免重复加上平方根)。最后判断因子和是否等于 num。

Python 代码示例:

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

def checkPerfectNumber(num):    if num <= 1:        return False    total = 1    i = 2    while i * i <= num:        if num % i == 0:            total += i            if i != num // i:                total += num // i        i += 1    return total == num


题目23:检测大写字母

问题描述:给定一个单词,判断其大写字母的使用是否正确。正确使用规则如下:

  • • 全部字母都是大写,如 "USA";
  • • 全部字母都是小写,如 "leetcode";
  • • 只有首字母大写,其余字母小写,如 "Google"。

解题思路:统计单词中大写字母的数量。若数量为 0 或等于单词长度,或数量为 1 且首字母为大写,则返回 True;否则返回 False。

Python 代码示例:

1
2
3
4

def detectCapitalUse(word):    upper_count = sum(1 for ch in word if ch.isupper())    return upper_count == 0 or upper_count == len(word) or (upper_count == 1 and word[0].isupper())


题目24:斐波那契数

问题描述:斐波那契数通常用 F(n) 表示,其中 F(0) = 0,F(1) = 1,F(n) = F(n-1) + F(n-2)(n > 1)。给定 n,计算 F(n)。

解题思路:使用迭代法。维护两个变量 prev 和 curr 分别表示 F(n-1) 和 F(n),从 F(0) 和 F(1) 开始递推,最终返回 F(n)。

Python 代码示例:

1
2
3
4
5
6
7
8
9
10

def fib(n):    if n < 2:        return n    prev, curr = 0, 1    for _ in range(2, n + 1):        prev, curr = curr, prev + curr    return curr


题目25:寻找数组的中心下标

问题描述:给定一个整数数组 nums,找到数组的中心下标。中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果不存在,返回 -1。如果有多个,返回最左边的那个。

解题思路:先计算数组总和 total。然后遍历数组,维护左侧元素和 left_sum,则右侧元素和为 total - left_sum - nums[i]。若两者相等则返回当前下标,否则将 nums[i] 累加到 left_sum。

Python 代码示例:

1
2
3
4
5
6
7
8
9
10

def pivotIndex(nums):    total = sum(nums)    left_sum = 0    for i, num in enumerate(nums):        if left_sum == total - left_sum - num:            return i        left_sum += num    return -1

题目26:至少是其他数字两倍的最大数

问题描述:给定一个整数数组 nums,找出其中最大的元素。如果最大元素至少是数组中每个其他数字的两倍,则返回最大元素的下标,否则返回 -1。

解题思路:遍历数组找到最大值和次大值,同时记录最大值的下标。若最大值大于等于次大值的两倍(或数组只有一个元素),则返回最大值下标;否则返回 -1。

Python 代码示例:

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

def dominantIndex(nums):    max_val = second_max = -1    max_index = -1    for i, num in enumerate(nums):        if num > max_val:            second_max = max_val            max_val = num            max_index = i        elif num > second_max:            second_max = num    return max_index if max_val >= 2 * second_max else -1


题目27:托普利茨矩阵

问题描述:给定一个 m x n 的矩阵 matrix,如果这个矩阵是托普利茨矩阵,返回 True;否则返回 False。托普利茨矩阵是指从左上到右下的每条对角线上的元素都相同。

解题思路:遍历矩阵中除最后一行和最后一列以外的所有元素,若 matrix[i][j] != matrix[i+1][j+1],则返回 False。遍历结束返回 True。

Python 代码示例:

1
2
3
4
5
6
7
8
9

def isToeplitzMatrix(matrix):    rows, cols = len(matrix), len(matrix[0])    for i in range(rows - 1):        for j in range(cols - 1):            if matrix[i][j] != matrix[i + 1][j + 1]:                return False    return True


题目28:寻找峰值

问题描述:峰值元素是指其值严格大于左右相邻值的元素。给定一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,返回任意一个即可。要求时间复杂度为 O(log n)。

解题思路:使用二分查找。比较中间元素与其右侧相邻元素:若 nums[mid] < nums[mid+1],说明峰值在右侧;否则峰值在左侧(包括中间)。不断缩小范围直到找到峰值。

Python 代码示例:

1
2
3
4
5
6
7
8
9
10
11

def findPeakElement(nums):    left, right = 0, len(nums) - 1    while left < right:        mid = (left + right) // 2        if nums[mid] < nums[mid + 1]:            left = mid + 1        else:            right = mid    return left


题目29:两数之和 II - 输入有序数组

问题描述:给定一个已按照非递减顺序排列的整数数组 numbers,请你从数组中找出两个数满足相加之和等于目标数 target。返回这两个数的下标(下标从 1 开始)。每个输入只对应唯一的答案,且不能重复使用相同的元素。

解题思路:使用双指针。左指针指向数组开头,右指针指向数组末尾。若两数之和等于 target 则返回下标;若和小于 target 则左指针右移;否则右指针左移。

Python 代码示例:

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

def twoSum(numbers, target):    left, right = 0, len(numbers) - 1    while left < right:        total = numbers[left] + numbers[right]        if total == target:            return [left + 1, right + 1]        elif total < target:            left += 1        else:            right -= 1    return []


题目30:寻找重复数

问题描述:给定一个包含 n + 1 个整数的数组 nums,其数字都在 [1, n] 范围内,可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。要求不修改原数组且空间复杂度为 O(1)。

解题思路:使用快慢指针(Floyd 判圈算法)。将数组视为链表,i -> nums[i]。由于存在重复数字,必然形成环。先用快慢指针找到相遇点,再用一个指针从头出发,与慢指针同时移动,相遇点即为重复数字。

Python 代码示例:

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

def findDuplicate(nums):    slow = fast = nums[0]    while True:        slow = nums[slow]        fast = nums[nums[fast]]        if slow == fast:            break    slow = nums[0]    while slow != fast:        slow = nums[slow]        fast = nums[fast]    return slow

相关学习资料