Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在只包含1和0的数组中查找第一个1的索引,所有0位于数组的左侧,所有1位于右侧?_Python_Algorithm - Fatal编程技术网

Python 在只包含1和0的数组中查找第一个1的索引,所有0位于数组的左侧,所有1位于右侧?

Python 在只包含1和0的数组中查找第一个1的索引,所有0位于数组的左侧,所有1位于右侧?,python,algorithm,Python,Algorithm,任务是在只包含1和0的数组中查找第一个1的索引,所有0位于数组的左侧,所有1位于右侧 例如,如果列表是[0,0,0,0,1,1],那么答案是4 所用的时间必须是对数 我尝试实现这样一种逻辑:如果中间的数字是0,我们只看列表的后半部分。另一方面,如果中间的数字是1,我们只看列表的前半部分。我们一直这样做直到只剩下一个号码 def first1(lst): start_val=0 end_val=len(lst) midpoint=(end_val+start_val)//2 whi

任务是在只包含1和0的数组中查找第一个1的索引,所有0位于数组的左侧,所有1位于右侧

例如,如果列表是[0,0,0,0,1,1],那么答案是4

所用的时间必须是对数

我尝试实现这样一种逻辑:如果中间的数字是0,我们只看列表的后半部分。另一方面,如果中间的数字是1,我们只看列表的前半部分。我们一直这样做直到只剩下一个号码

def first1(lst):
  start_val=0
  end_val=len(lst)
  midpoint=(end_val+start_val)//2
  while end_val-start_val>1:
    if lst[midpoint]==1:
      endval=midpoint-1
      midpoint=start_val+end_val//2
    else:
      startval=midpoint+1
      midpoint=start_val+end_val//2
  return midpoint

这给了我一个无限循环。我不明白我做错了什么。

读到这篇文章你会自责的。初始化变量start_val和end_val,但将endpoint+1指定给startval和endval(变量名称中没有下划线)

否则,它可以正常工作。我没有立即看到它,所以我在循环中加入了一个print语句,并延迟了1秒,这样我就可以看到发生了什么。此外,我对代码进行了一些格式化,使其更具可读性,主要遵循在变量和运算符之间放置空格的建议

import time
def first1(lst):
  start_val = 0
  end_val = len(lst)
  midpoint = (end_val + start_val) // 2
  while end_val - start_val > 1:
    if lst[midpoint] == 1:
      end_val = midpoint - 1
      midpoint = (start_val + end_val) // 2
    else:
      start_val = midpoint + 1
      midpoint = (start_val + end_val) // 2
    print(start_val, midpoint, end_val)
    time.sleep(1)
  return midpoint

print(first1([0,0,0,0,1,1]))

您出现此问题的原因是因为在线

endval=midpoint-1
线路呢

startval=midpoint+1
开始值和结束值中缺少下划线。
但是,由于使用的方法,如果长度不是2</p>,你就可以不工作了,你可以考虑你的数组排序,并使用二进制搜索算法。这将给您一个O(log(N))时间复杂度

例如:

from bisect import bisect_left

a = [0,0,0,0,1,1]
p = bisect_left(a,1)
print(p) # 4
如果不允许使用Python模块,您可以编写自己的二进制搜索:

def find1(array):
    lo,hi  = 0,len(array)-1
    while hi>=lo:
        mid = (hi+lo)//2
        if array[mid]: hi = mid-1
        else:          lo = mid+1
    return hi+1

find1([0,0,0,0,1,1]) # 4

我仍然得到一个列表索引超出范围错误。RE:“你可以考虑你的数组排序,并使用一个二进制搜索算法”:事实上,这正是他正在做的。