首页 > 其他 > 详细

拼多多服务端实习生笔试-滑动窗口2018/4/3

时间:2018-04-03 23:32:17      阅读:384      评论:0      收藏:0      [点我收藏+]

有一整数数组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

原文:https://www.cnblogs.com/dshn/p/8711213.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!