1. 程式人生 > >拼多多服務端實習生筆試-滑動窗口2018/4/3

拼多多服務端實習生筆試-滑動窗口2018/4/3

差值 最大 表數 tdi n-k 一行 scan join pytho

有一整數數組A[n],滑動窗口大小為k,在A上從左到右移動,每次一步,求此過程中每步的子數組的最大值與最小值的差值

eg:

數組A=1 3 -1 -3 5 3 6 7 k=3

滑動窗口的位置 最大值 最小值 差值

[1 3 -1 -3] 5 3 6 7 3 -1 4

1 [3 -1 -3] 5 3 6 7 3 -3 6

1 3[ -1 -3 5 ]3 6 7 5 -3 8

....

輸入:
第一行:n k n代表數組A的長度,k代表滑動窗口大小

第二行:n個整數,即為A數組

輸出:包含n-k+1個整數,表示每步的子數組的最大值與最小值的差值

樣例:

輸入

8 3

1 3 -1 -3 5 3 6 7

輸出

4 6 8 8 3 4

兩種語言,方法相同

C++(沒有提交,不確定會不會超時)

#include <iostream>
#include 
<cstdio> #include <cstring> #include <vector> #include <cstdlib> #include <algorithm> using namespace std; int a[100005]; int main() { int n,k; int maxs,mins; while(scanf("%d%d",&n,&k)) { for(int i=1; i<=n; i++) { scanf(
"%d",&a[i]); } maxs=a[1]; mins=a[1]; for(int j=2; j<=k; j++) { if(a[j]>maxs) maxs=a[j]; if(a[j]<mins) mins=a[j]; } printf("%d",maxs-mins); for(int i=k+1; i<=n; i++) { if(a[i-k]==maxs||a[i-k]==mins) { maxs=a[i-k+1]; mins=a[i-k+1]; for(int j=i-k+2; j<=i; j++) { if(a[j]>maxs) maxs=a[j]; if(a[j]<mins) mins=a[j]; } } else { if(a[i]>maxs) { maxs=a[i]; } if(a[i]<mins) { mins=a[i]; } } printf(" %d",maxs-mins); } printf("\n"); } return 0; }

python3(AC)

n_k = input()
n,k = map(int,n_k.split( ))
data = input()
_list = list(map(int,data.split( )))
anslist = []
slide = _list[0:k]
_max = max(slide)
_min = min(slide)
anslist.append(_max-_min)
for poi in range(n-k):
    if _list[poi] == _max:
        _max = max(_list[poi+1:poi+k+1])
        _min = min(_min,_list[poi+k])
    elif _list[poi] == _min:
        _min = min(_list[poi+1:poi+k+1])
        _max = max(_max,_list[poi+k])
    else:
        _max = max(_max,_list[poi+k])
        _min = min(_min,_list[poi+k])
    anslist.append(_max-_min)
print( .join(map(str,anslist)))

拼多多服務端實習生筆試-滑動窗口2018/4/3