灿砸


私信TA

用户名:xiboliyalang

访问量:1080

签 名:

等  级
排  名 4710
经  验 1648
参赛次数 0
文章发表 10
年  龄 23
在职情况 学生
学  校 东北师范大学
专  业 软件工程

  自我简介:

解题思路:
经过二分查找后,low和high分别会指向比 x 大和比 x 小的元素,计算这两个元素到 x 的距离,返回更小的那个元素值,不清楚的话可以在代码中打印出经过循环后的low和high值。

注意事项:

注意边界的情况!

假设列表是 [2,5,8]

例如查找的是10,low最后为3,high为2,此时直接返回列表最后一个元素即可;

如果查找的是-1,high最后的取值为-1,low为0,此时直接返回列表第一个值即可。
参考代码:

# 数据的输入
n = int(input())
list1 = list(map(int, input().split()))
m = int(input())


def find_closest(li, x):
    low = 0
    high = len(li) - 1
    while low <= high:
        mid = (low + high) // 2
        if list1[mid] == x:
            return list1[mid]
        elif list1[mid] < x:
            low = mid + 1
        else:
            high = mid - 1
    # 经过二分查找后,low和high分别会指向比 x 大和比 x 小的元素
    # 计算这两个元素到 x 的距离,返回更小的那个元素值
    if low >= len(li):
        return li[-1]
    elif high < 0:
        return li[0]
    elif abs(li[low] - x) < abs(li[high] - x):
        return li[low]
    else:
        return li[high]

        
for i in range(m):
    x = int(input())
    print(find_closest(list1, x))


 

0.0分

2 人评分

  评论区

  • «
  • »