ARTICLE · 1116089
2026网安习题大全(10)
题目91:汇总区间
问题描述:给定一个无重复元素的有序整数数组 nums,返回恰好覆盖数组中所有数字的最小有序区间范围列表。每个区间的范围表示为 "a->b"(若 a != b)或 "a"(若 a == b)。
解题思路:使用双指针遍历数组。用 start 标记当前区间的起点,end 不断向后延伸,直到下一个数字不连续为止。然后根据 start 和 end 是否相等生成对应格式的字符串,加入结果列表。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 def summaryRanges(nums): result = [] i = 0 while i < len(nums): start = nums[i] while i + 1 < len(nums) and nums[i + 1] == nums[i] + 1: i += 1 if start == nums[i]: result.append(str(start)) else: result.append(f"{start}->{nums[i]}") i += 1 return result
题目92:存在重复元素 II
问题描述:给定一个整数数组 nums 和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,满足 nums[i] == nums[j] 且 abs(i - j) <= k。
解题思路:使用哈希表记录每个元素最近一次出现的索引。遍历数组时,若当前元素已在哈希表中且当前索引与上次出现索引之差不超过 k,则返回 True;否则更新该元素的最新索引。
Python 代码示例:
1 2 3 4 5 6 7 8 9 def containsNearbyDuplicate(nums, k): last_seen = {} for i, num in enumerate(nums): if num in last_seen and i - last_seen[num] <= k: return True last_seen[num] = i return False
题目93:汇总区间合并
问题描述:给定一组区间 intervals,其中可能包含重叠区间。请合并所有重叠区间,并返回它们覆盖的总长度(不重复计算重叠部分)。
解题思路:先按区间起点排序。遍历区间时维护当前合并区间的 start 和 end,若当前区间起点大于 end,则将当前合并区间长度累加,并开始新的合并区间;否则更新 end 为两者较大值。遍历结束后再累加最后一个合并区间的长度。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def totalCoveredLength(intervals): if not intervals: return 0 intervals.sort(key=lambda x: x[0]) total = 0 start, end = intervals[0] for s, e in intervals[1:]: if s > end: total += end - start start, end = s, e else: end = max(end, e) total += end - start return total
题目94:同构字符串
问题描述:给定两个字符串 s 和 t,判断它们是否是同构的。若 s 中的字符可以按某种映射关系替换得到 t,且不同字符不能映射到同一字符,但可以映射到自身,则称两个字符串是同构的。
解题思路:使用两个哈希表分别记录 s -> t 和 t -> s 的映射关系。遍历两个字符串的每个字符,若映射冲突则返回 False,否则建立映射。遍历结束后返回 True。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def isIsomorphic(s, t): if len(s) != len(t): return False map_s_t = {} map_t_s = {} for ch_s, ch_t in zip(s, t): if ch_s in map_s_t and map_s_t[ch_s] != ch_t: return False if ch_t in map_t_s and map_t_s[ch_t] != ch_s: return False map_s_t[ch_s] = ch_t map_t_s[ch_t] = ch_s return True
题目95:单词规律
问题描述:给定一种规律 pattern 和一个字符串 s,判断 s 是否遵循相同的规律。这里的遵循指完全匹配,例如 pattern = "abba",s = "dog cat cat dog" 则遵循规律。
解题思路:先将 s 按空格拆分为单词列表。若单词数量与 pattern 长度不同则返回 False。使用两个哈希表分别记录 pattern -> word 和 word -> pattern 的映射,遍历检查是否一致。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def wordPattern(pattern, s): words = s.split() if len(pattern) != len(words): return False p_to_w = {} w_to_p = {} for p, w in zip(pattern, words): if p in p_to_w and p_to_w[p] != w: return False if w in w_to_p and w_to_p[w] != p: return False p_to_w[p] = w w_to_p[w] = p return True
题目96:快乐数
问题描述:编写一个算法判断一个数 n 是否为快乐数。快乐数的定义:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果最终能变为 1,则这个数是快乐数。
解题思路:使用快慢指针检测循环。定义 squareSum(n) 计算各位数字平方和。慢指针每次走一步,快指针每次走两步。若快指针变为 1 则为快乐数;若快慢指针相遇且不为 1,则进入循环,不是快乐数。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def isHappy(n): def squareSum(num): total = 0 while num: digit = num % 10 total += digit * digit num //= 10 return total slow = n fast = squareSum(n) while fast != 1 and slow != fast: slow = squareSum(slow) fast = squareSum(squareSum(fast)) return fast == 1
题目97:计数质数
问题描述:给定一个整数 n,返回所有小于非负整数 n 的质数的数量。
解题思路:使用埃拉托斯特尼筛法。创建一个长度为 n 的布尔数组,初始全部为 True。从 2 开始,若当前数为质数,则将其所有倍数标记为非质数。最后统计数组中为 True 的个数。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 def countPrimes(n): if n < 2: return 0 is_prime = [True] * n is_prime[0] = is_prime[1] = False for i in range(2, int(n ** 0.5) + 1): if is_prime[i]: for j in range(i * i, n, i): is_prime[j] = False return sum(is_prime)
题目98:3 的幂
问题描述:给定一个整数 n,判断它是否是 3 的幂次方。如果是,返回 True;否则返回 False。
解题思路:若 n <= 0 则直接返回 False。不断将 n 除以 3,若最终能整除到 1 则为 3 的幂。也可以利用 32 位整数中 3 的最大幂次 3^19 = 1162261467,判断 n 是否能整除该数。
Python 代码示例:
1 2 3 4 5 6 7 8 def isPowerOfThree(n): if n <= 0: return False while n % 3 == 0: n //= 3 return n == 1
题目99:4 的幂
问题描述:给定一个整数 n,判断它是否是 4 的幂次方。如果是,返回 True;否则返回 False。
解题思路:4 的幂一定是 2 的幂,且其二进制表示中 1 只出现在奇数位上。先判断 n > 0 且 n & (n - 1) == 0(即为 2 的幂),再用掩码 0x55555555(奇数位全为 1)判断 1 是否在奇数位上。
Python 代码示例:
1 2 def isPowerOfFour(n): return n > 0 and (n & (n - 1)) == 0 and (n & 0x55555555) != 0
题目100:两个数组的交集
问题描述:给定两个数组 nums1 和 nums2,返回它们的交集。输出结果中的每个元素一定是唯一的,可以不考虑输出结果的顺序。
解题思路:将一个数组转为集合,然后遍历另一个数组,若元素在集合中则加入结果集,并从集合中移除该元素以避免重复。
Python 代码示例:
1 2 3 4 5 6 7 8 9 def intersection(nums1, nums2): set1 = set(nums1) result = set() for num in nums2: if num in set1: result.add(num) return list(result)