Python 在只包含1和0的数组中查找第一个1的索引,所有0位于数组的左侧,所有1位于右侧?
任务是在只包含1和0的数组中查找第一个1的索引,所有0位于数组的左侧,所有1位于右侧 例如,如果列表是[0,0,0,0,1,1],那么答案是4 所用的时间必须是对数 我尝试实现这样一种逻辑:如果中间的数字是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
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:“你可以考虑你的数组排序,并使用一个二进制搜索算法”:事实上,这正是他正在做的。