ARTICLE · 1127988
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