ARTICLE · 1119352
2026网安习题大全(11)
题目1:两个数组的交集 II
问题描述:给定两个整数数组 nums1 和 nums2,返回它们的交集。输出结果中每个元素出现的次数应与元素在两个数组中出现次数的最小值一致。可以不考虑输出结果的顺序。
解题思路:使用哈希表统计 nums1 中每个元素的出现次数,然后遍历 nums2,若当前元素在哈希表中且计数大于 0,则加入结果并将计数减一。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 from collections import Counterdef intersect(nums1, nums2): count = Counter(nums1) result = [] for num in nums2: if count[num] > 0: result.append(num) count[num] -= 1 return result
题目2:二叉树的所有路径
问题描述:给定一个二叉树的根节点 root,返回所有从根节点到叶子节点的路径。路径以字符串形式表示,节点之间用 -> 连接。
解题思路:使用 DFS 回溯。递归时维护当前路径,当到达叶子节点时将路径拼接为字符串加入结果集。递归左右子树后将当前节点从路径中弹出。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def binaryTreePaths(root): result = [] def dfs(node, path): if not node: return path.append(str(node.val)) if not node.left and not node.right: result.append('->'.join(path)) else: dfs(node.left, path) dfs(node.right, path) path.pop() dfs(root, []) return result
题目3:各位相加
问题描述:给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数,返回这个结果。
解题思路:数学上,结果等于 num % 9,若为 0 且 num != 0 则结果为 9。也可以使用循环逐位相加直到小于 10。
Python 代码示例:
1 2 3 4 def addDigits(num): if num == 0: return 0 return (num - 1) % 9 + 1
题目4:丑数
问题描述:丑数是指只包含质因数 2、3、5 的正整数。给定一个整数 n,判断它是否为丑数。
解题思路:若 n <= 0 则返回 False。不断将 n 除以 2、3、5,直到不能整除为止。最终若 n == 1 则为丑数。
Python 代码示例:
1 2 3 4 5 6 7 8 9 def isUgly(n): if n <= 0: return False for factor in (2, 3, 5): while n % factor == 0: n //= factor return n == 1
题目5:丢失的数字
问题描述:给定一个包含 [0, n] 中 n 个数的数组 nums,找出 [0, n] 范围内没有出现在数组中的那个数。
解题思路:利用异或运算。将 0 到 n 的所有数与数组中的所有数依次异或,成对出现的数会抵消,最终结果即为缺失的数字。
Python 代码示例:
1 2 3 4 5 6 7 def missingNumber(nums): result = len(nums) for i, num in enumerate(nums): result ^= i ^ num return result
题目6:第一个错误的版本
问题描述:你是产品经理,目前正在带领一个团队开发新的产品。假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。你可以调用 isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。要求尽量减少调用 API 的次数。
解题思路:使用二分查找。若中间版本是错误版本,则第一个错误版本在左侧(包括中间);否则在右侧。不断缩小范围直到找到第一个错误版本。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 def firstBadVersion(n): left, right = 1, n while left < right: mid = (left + right) // 2 if isBadVersion(mid): right = mid else: left = mid + 1 return left
题目7:反转链表
问题描述:给定单链表的头节点 head,反转链表,并返回反转后的头节点。
解题思路:使用双指针迭代。维护 prev 和 curr,每次将 curr.next 指向 prev,然后同时向前移动两个指针,直到 curr 为空,此时 prev 即为新的头节点。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 def reverseList(head): prev = None curr = head while curr: nxt = curr.next curr.next = prev prev = curr curr = nxt return prev
题目8:回文数
问题描述:给定一个整数 x,如果 x 是一个回文整数,返回 True;否则返回 False。回文数是指正序读和倒序读都一样的整数。
解题思路:若 x < 0 或 x 是以 0 结尾且不为 0 的数,则直接返回 False。否则将 x 的后半部分反转,当反转后的数大于等于剩余部分时停止,最后比较两半是否相等(奇数位时去掉中间位)。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 def isPalindrome(x): if x < 0 or (x % 10 == 0 and x != 0): return False reversed_half = 0 while x > reversed_half: reversed_half = reversed_half * 10 + x % 10 x //= 10 return x == reversed_half or x == reversed_half // 10
题目9:删除排序链表中的重复元素
问题描述:给定一个已排序的链表的头节点 head,删除所有重复的元素,使每个元素只出现一次,返回已排序的链表。
解题思路:由于链表已排序,重复元素一定相邻。使用一个指针遍历链表,若当前节点与下一个节点值相同,则将当前节点的 next 指向下下个节点;否则移动到下一个节点。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 def deleteDuplicates(head): curr = head while curr and curr.next: if curr.val == curr.next.val: curr.next = curr.next.next else: curr = curr.next return head
题目10:合并两个有序数组
问题描述:给定两个按非递减顺序排列的整数数组 nums1 和 nums2,以及两个整数 m 和 n,分别表示 nums1 和 nums2 中的元素数量。请将 nums2 合并到 nums1 中,使合并后的数组同样按非递减顺序排列。要求原地修改 nums1。
解题思路:使用三指针从后向前合并。p1 指向 nums1 的有效元素末尾,p2 指向 nums2 的末尾,p 指向 nums1 的末尾。每次比较 nums1[p1] 和 nums2[p2],将较大者放入 nums1[p],并向前移动相应指针。
Python 代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 def merge(nums1, m, nums2, n): p1, p2, p = m - 1, n - 1, m + n - 1 while p1 >= 0 and p2 >= 0: if nums1[p1] > nums2[p2]: nums1[p] = nums1[p1] p1 -= 1 else: nums1[p] = nums2[p2] p2 -= 1 p -= 1 nums1[:p2 + 1] = nums2[:p2 + 1]