📅  最后修改于: 2023-12-03 15:28:36.456000             🧑  作者: Mango
本次模拟考试的第58章,是关于程序员技能的考察。以下是题目解析和对应的程序示例。
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
示例:
nums = [2, 7, 11, 15]
target = 9
输出: [0, 1]
解释: nums[0] + nums[1] = 2 + 7 = 9
这是一道简单的题目,可以使用哈希表来解决。具体实现如下:
def twoSum(nums, target):
hash_map = {}
for i, num in enumerate(nums):
if target - num in hash_map:
return [hash_map[target - num], i]
hash_map[num] = i
return []
实现一个函数,用于计算两个密码之间的最小ASCII删除和。
示例:
s1 = "sea"
s2 = "eat"
输出: 231
说明: 在不附加任何"d"之后,"sea"变成"ea","eat"变成"ea"。
两个字符串中都只保留"ea",并且总共删除的ASCII值为231,这是需要的最低删除数。
这道题可以使用动态规划来解决。我们可以先计算出两个字符串的最长公共子序列,然后将两个字符串长度减去最长公共子序列的长度,最后求出删除字符的ASCll值总和。具体实现如下:
def minimumDeleteSum(s1, s2):
m, n = len(s1), len(s2)
dp = [[0] * (n+1) for _ in range(m+1)]
for i in range(1, m+1):
for j in range(1, n+1):
if s1[i-1] == s2[j-1]:
dp[i][j] = dp[i-1][j-1] + ord(s1[i-1])
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
s1_sum = sum(ord(ch) for ch in s1)
s2_sum = sum(ord(ch) for ch in s2)
return s1_sum + s2_sum - 2*dp[m][n]
给定一个数组和一个整数k,请你找到数组中和为k的连续子数组的个数。
示例:
nums = [1,1,1]
k = 2
输出: 2
这道题可以使用前缀和和哈希表来解决。我们用sum[i]表示前i个元素的和,则sum[i]-sum[j-1]就表示从j到i的一个子数组的和,利用这个公式可以将数组中每个子数组的和都算出来,然后统计和为k的子数组个数。具体实现如下:
def subarraySum(nums, k):
hash_map = {0:1}
count = 0
presum = 0
for num in nums:
presum += num
if presum - k in hash_map:
count += hash_map[presum-k]
if presum in hash_map:
hash_map[presum] += 1
else:
hash_map[presum] = 1
return count
以上是本次模拟考试第58章中的几道典型题目,涵盖了算法和数据结构中的多个知识点。在实际编程中,掌握这些思路和方法是非常有必要的。