夜雨聆风学习资料网

ARTICLE · 1123854

2026网安习题大全(12)

2026网安习题大全(12)

题目11:x 的平方根

问题描述:给定一个非负整数 x,计算并返回 x 的算术平方根,结果只保留整数部分,小数部分将被舍去。

解题思路:使用二分查找。在 [0, x] 范围内查找最大的整数 mid 使得 mid * mid <= x。注意使用 mid <= x // mid 避免整数溢出。

Python 代码示例:

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

def mySqrt(x):    if x < 2:        return x    left, right = 1, x // 2    while left <= right:        mid = (left + right) // 2        if mid <= x // mid:            left = mid + 1        else:            right = mid - 1    return right


题目12:爬楼梯

问题描述:假设你正在爬楼梯,需要 n 阶才能到达楼顶。每次你可以爬 1 或 2 个台阶,问有多少种不同的方法可以爬到楼顶。

解题思路:使用动态规划。设 dp[i] 表示爬到第 i 阶的方法数,则 dp[i] = dp[i-1] + dp[i-2],初始条件为 dp[1] = 1、dp[2] = 2。可以用两个变量滚动更新,将空间复杂度优化为 O(1)。

Python 代码示例:

1
2
3
4
5
6
7
8
9
10

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


题目13:删除排序数组中的重复项

问题描述:给定一个升序排列的数组 nums,原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。要求不使用额外空间,且元素的相对顺序保持一致。

解题思路:使用双指针。slow 指向当前已处理的不重复部分的末尾,fast 遍历数组。当 nums[fast] != nums[slow] 时,将 nums[fast] 赋值给 nums[slow + 1] 并移动 slow。

Python 代码示例:

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

def removeDuplicates(nums):    if not nums:        return 0    slow = 0    for fast in range(1, len(nums)):        if nums[fast] != nums[slow]:            slow += 1            nums[slow] = nums[fast]    return slow + 1


题目14:移除元素

问题描述:给定一个数组 nums 和一个值 val,原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。要求不使用额外空间,且元素的相对顺序可以改变。

解题思路:使用双指针。slow 指向当前应放置有效元素的位置,fast 遍历数组。当 nums[fast] != val 时,将 nums[fast] 赋值给 nums[slow] 并移动 slow。最终 slow 即为新长度。

Python 代码示例:

1
2
3
4
5
6
7
8
9

def removeElement(nums, val):    slow = 0    for fast in range(len(nums)):        if nums[fast] != val:            nums[slow] = nums[fast]            slow += 1    return slow


题目15:找出字符串中第一个匹配项的下标

问题描述:给定两个字符串 haystack 和 needle,在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1。

解题思路:遍历 haystack,对每个位置检查从该位置开始的子串是否与 needle 相等。也可以使用 KMP 算法将时间复杂度优化到 O(m + n)。这里给出简单实现。

Python 代码示例:

1
2
3
4
5
6
7
8
9
10
11

def strStr(haystack, needle):    if not needle:        return 0    n, m = len(haystack), len(needle)    for i in range(n - m + 1):        if haystack[i:i + m] == needle:            return i    return -1

题目16:搜索插入位置

问题描述:给定一个排序数组 nums 和一个目标值 target,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。要求时间复杂度为 O(log n)。

解题思路:使用二分查找。若 nums[mid] < target,则目标位置在右侧;否则在左侧(包括中间)。循环结束时 left 即为插入位置。

Python 代码示例:

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

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


题目17:最大连续 1 的个数

问题描述:给定一个二进制数组 nums,计算其中最大连续 1 的个数。

解题思路:遍历数组,用 count 记录当前连续 1 的个数,用 max_count 记录最大值。遇到 1 时 count 加一,遇到 0 时将 count 重置为 0,并更新最大值。

Python 代码示例:

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

def findMaxConsecutiveOnes(nums):    max_count = 0    count = 0    for num in nums:        if num == 1:            count += 1            max_count = max(max_count, count)        else:            count = 0    return max_count


题目18:提莫攻击

问题描述:给定提莫攻击的时间序列 timeSeries 和中毒持续时间 duration,计算提莫处于中毒状态的总时间。若两次攻击间隔小于 duration,则中毒时间不会累加。

解题思路:遍历攻击时间序列,每次计算相邻两次攻击的时间差,若差值小于 duration 则累加差值,否则累加 duration。最后再加上最后一次攻击的持续时间。

Python 代码示例:

1
2
3
4
5
6
7
8
9
10

def findPoisonedDuration(timeSeries, duration):    if not timeSeries:        return 0    total = 0    for i in range(1, len(timeSeries)):        total += min(timeSeries[i] - timeSeries[i - 1], duration)    return total + duration


题目19:下一个更大元素 I

问题描述:给定两个没有重复元素的数组 nums1 和 nums2,其中 nums1 是 nums2 的子集。找出 nums1 中每个元素在 nums2 中的下一个比其大的值。如果不存在,则对应位置输出 -1。

解题思路:先用单调栈预处理 nums2,得到每个元素的下一个更大元素,存入哈希表。然后遍历 nums1,从哈希表中查找对应结果。

Python 代码示例:

1
2
3
4
5
6
7
8
9
10

def nextGreaterElement(nums1, nums2):    stack = []    next_greater = {}    for num in nums2:        while stack and stack[-1] < num:            next_greater[stack.pop()] = num        stack.append(num)    return [next_greater.get(num, -1) for num in nums1]


题目20:键盘行

问题描述:给定一个字符串数组 words,返回其中可以由键盘同一行字母打印出来的单词。键盘的三行字母分别为:

  • • 第一行:qwertyuiop
  • • 第二行:asdfghjkl
  • • 第三行:zxcvbnm

解题思路:将每个字母映射到其所在的行号。遍历每个单词,检查所有字母是否属于同一行,若是则加入结果列表。

Python 代码示例:

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

def findWords(words):    row_map = {}    for i, row in enumerate(['qwertyuiop', 'asdfghjkl', 'zxcvbnm']):        for ch in row:            row_map[ch] = i    result = []    for word in words:        if len({row_map[ch.lower()] for ch in word}) == 1:            result.append(word)    return result

相关学习资料