数组元素分类聚合,譬如给出数组[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)