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

Posted 凌晨一点

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拼多多服务端实习生笔试-滑动窗口2018/4/3相关的知识,希望对你有一定的参考价值。

有一整数数组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的主要内容,如果未能解决你的问题,请参考以下文章

(4道全A)拼多多2021届提前批-服务端研发工程师笔试

(4道全A)拼多多2021届提前批-服务端研发工程师笔试

广州|拼多多聘前端开发工程师后端开发工程师产品经理..等

拼多多代运营托管 电商新理念的领导者

拼多多 笔试记录

拼多多面试题——算法实习生