数组元素分类聚合,譬如给出数组[1 3 1 4 0],找出所有小于k的元素,并通过对换数组的元素,使所有小于k的元素聚集在一起,问最少要调换几次?如本例中,若k=2,则将1和4对换或将0和3对换,都能达到目的,即最少对换一次 思路:找出一个长度等于数组中小于k的元素个数的滑窗,这个滑窗中不小于k的元素个数最少
#华为机试第二题:
充分利用python的切片及count方法优势
import sys
for line in sys.stdin:
s=line.strip().split()
sint=list(map(int,s))
cnt=0
k=int(input())
for i in range(len(sint)):
if sint[i]<k:
cnt+=1 #先找出所有小于k的元素个数,即滑窗的长度
else:
sint[i]=k+1 #把所有不小于k的元素统一成一个大值方便下面用count方法
minx=cnt;left=tarcnt=0#tarcnt即为大于等于k的元素个数,这里初始设为0
while left<len(s)-cnt: #利用切片功能
tarcnt=(sint[left:left+cnt].count(k+1))#不用一个个判断,直接用count方法
minx=min(minx,tarcnt)#只取较小的那个
left+=1 #窗口右移
print(minx)