夜雨聆风学习资料网

ARTICLE · 1116089

2026网安习题大全(10)

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)

相关学习资料