• xqfyhk

    arr=[1.2.3.4.5.6.7.8.9.10]
    for i in range(len(10))
    23页这个len函数绝对错了

    xqfyhk发表于 2022/8/28 8:42:34
  • 小哲

    二分查找的最终代码

    二分查找 (数组长度越长越能提现性能)

    “””
    二分查找需要两个指针,指向数组第一个元素叫头指针,指向数组最后一个元素叫尾指针,
    查找范围,包括头指针指向的元素但不包括尾指针指向的元素。

    把头指针和尾指针的下标相加再除以2来得到中间数的下标 (0+8)/2 = 4 (然后拿4的下标值和要比较的数作比较)
    尾指针移动 = (0+尾指针)/2  (尾指针是随时移动的),
    

    “””

    numbers = [200, 20, 30, 40, 50, 60, 700, 710, 800, 900]

    head, tail = 0, len(numbers)

    查找8的下标

    search = 710
    ans = 0

    查找范围大于1时才会进入while

    while tail - head > 1:
    mid = (head + tail) // 2
    if search < numbers[mid]:

        # 重置尾指针(小于时重置尾指针)
        tail = mid + 1
        pass
    if search > numbers[mid]:
        # 大于时重置头指针
        head = mid + 1
        pass
    if search == numbers[mid]:
        # 找到元素时,直接结束
        ans = mid
        break
    # 走到这里说明输入的数根本不在数组里
    if mid == 1:
        ans = -1
        break
    pass
    

    else:
    if search == numbers[head]:
    ans = mid
    pass
    else:
    ans = -1
    pass

    print(ans)

    小哲发表于 2021/7/18 15:11:53
  • mituofo

    么这错多


    mituofo发表于 2020/4/23 19:05:11
  • ljt1469

    第四章计算岛的大小的算法描述是没问题的,但是给出的程序是有问题。因为描述中说如果一个搜索点周围不是海水就是已经遍历的陆地时,返回上一搜索点。但是程序里是没有体现的。这会造成错误,比如下面这个岛就算不对。
    0 1 1 ////////////////////////////////////////////////////0 2 1
    1 1 1 /////////////////////////////////////////////////// 2 2 1
    1 1 1 如果按照书上的算法,最后得到 2 2 1 。因为到了0下面那个二时,程序就停止了。但是,事实上,应该逐一返回,这样才能遍历剩下的1.

    ljt1469发表于 2019/7/12 21:36:52
  • bjllywk

    页码:56 • 行数:13 • 印次 3
    ans = ans + arr2[i:]
    这里有问题,如果arr2[i]已经插入到列表中时,这里就会多加一次,例如将arr2改为[2,5,8,9]就会出错,或者将arr2改为[2,5,8,11,12]也会出错。修改方案:
    i = 0
    j = 0
    ans = arr1.copy()
    while j < len(arr1) and i < len(arr2):
    if arr2[i] <= arr1[j]:
    ans.insert(j + i, arr2[i])
    i += 1
    else:
    j += 1
    else:
    ans = ans + arr2[i:]
    print(ans)
    print(i)
    print(j)

    bjllywk发表于 2019/6/8 8:18:08
    • JY

      这段代码确实有问题,作者号称资深10年编程经验,考虑问题太不全面了。
      在书中源代码的基础上,最简单的修改是将代码12和13行移入for代码块,并修改为
      else:
      ans.insert(ind + i,arr2[i])

      JY发表于 2019/6/30 23:13:30
    • bjllywk

      我现在看出怎么回事了,最后的else的子句应该属于while循环,而不是for循环,else子句部分少缩进了一次,另外在子句中应添加break子句。

      bjllywk发表于 2019/11/29 18:24:29
  • 1
  • 2
  • 3