AI刷题记录(四) | 豆包MarsCode AI刷题

44 阅读2分钟

计算从x到y的最小步数

问题描述

小F正在进行一个 AB 实验,需要从整数位置 x 移动到整数位置 y。每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的 -1+0 或 +1)。首末两步的步长必须是 1。求从 x 到 y 的最少步数。

输入描述

输入包含两个整数 x 和 y,表示起始位置和目标位置。

输出描述

输出从 x 到 y 所需的最小步数。

思路

  1. 计算差值:首先计算目标位置 y 与起始位置 x 的绝对差值 x,即 x = abs(x_position - y_position)

  2. 逐步减少差值:使用一个循环来逐步减少差值 x。每次循环中,差值 x 会减少 2 * cnt,其中 cnt 是当前的步数计数器。这个循环会一直进行,直到差值 x 小于或等于 2 * cnt

  3. 判断步数:根据差值 x 的不同情况,返回不同的步数:

    • 如果 x 为 0,说明差值已经被完全消除,返回 cnt * 2 - 2
    • 如果 x 大于 0 且小于等于 cnt,返回 cnt * 2 - 1
    • 如果 x 大于 cnt 且小于等于 2 * cnt,返回 cnt * 2

代码

def solution(x_position, y_position):
    # Please write your code here
    x = abs(x_position - y_position)
    cnt = 1
    while x > 2 * cnt: 
        x -= 2 * cnt
        cnt += 1
    if x == 0: return cnt * 2 - 2
    if x > 0 and x <= cnt: return cnt * 2 - 1
    if x >= cnt and x <= 2 * cnt: return cnt * 2
    return 0

if __name__ == "__main__":
    #  You can add more test cases here
    print(solution(12, 6) == 4 )
    print(solution(34, 45) == 6)
    print(solution(50, 30) == 8)

打点计数器的区间合并

问题描述

小明正在设计一台打点计数器,该计数器可以接受多个递增的数字范围,并对这些范围内的每个唯一数字打点。如果多个范围之间有重叠,计数器将合并这些范围并只对每个唯一数字打一次点。小明需要你帮助他计算,在给定的多组数字范围内,计数器会打多少个点。

例如,给定三个数字范围 [1, 4], [7, 10], 和 [3, 5],计数器首先将这些范围合并,变成 [1, 5] 和 [7, 10],然后计算这两个范围内共有多少个唯一数字,即从 1 到 5 有 5 个数字,从 7 到 10 有 4 个数字,共打 9 个点。

思路

双指针,分别记录一个合并后的区间的左端点和右端点,每当枚举到一个新的区间时,就判断是否需要更新这两个指针,并更新答案。

代码

def solution(inputArray):
    inputArray = sorted(inputArray, key=lambda x: x[0])
    l, r = inputArray[0][0], inputArray[0][1]
    ans = 0
    for i in range(0, len(inputArray)):
        nl, nr = inputArray[i][0], inputArray[i][1]
        if r < nl:
            ans += r - l
            l = nl
        r = max(r, nr)
    ans += r - l
    return ans