📜  门| GATE 2017 MOCK II |第58章(1)

📅  最后修改于: 2023-12-03 15:28:36.456000             🧑  作者: Mango

门| GATE 2017 MOCK II |第58章

本次模拟考试的第58章,是关于程序员技能的考察。以下是题目解析和对应的程序示例。

题目1

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

示例:

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 []
题目2

实现一个函数,用于计算两个密码之间的最小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]
题目3

给定一个数组和一个整数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章中的几道典型题目,涵盖了算法和数据结构中的多个知识点。在实际编程中,掌握这些思路和方法是非常有必要的。