计算从x到y的最小步数
问题描述
小F正在进行一个 AB 实验,需要从整数位置 x 移动到整数位置 y。每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的 -1,+0 或 +1)。首末两步的步长必须是 1。求从 x 到 y 的最少步数。
输入描述
输入包含两个整数 x 和 y,表示起始位置和目标位置。
输出描述
输出从 x 到 y 所需的最小步数。
思路
-
计算差值:首先计算目标位置
y与起始位置x的绝对差值x,即x = abs(x_position - y_position)。 -
逐步减少差值:使用一个循环来逐步减少差值
x。每次循环中,差值x会减少2 * cnt,其中cnt是当前的步数计数器。这个循环会一直进行,直到差值x小于或等于2 * cnt。 -
判断步数:根据差值
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