zoukankan      html  css  js  c++  java
  • 拼多多服务端实习生笔试-滑动窗口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("
    ");
        }
        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)))
  • 相关阅读:
    node.js ---path模块
    es6箭头函数this问题
    Codeforces Round #576 (Div. 2) | CF1199 补题
    Hungary
    CF 1196D2 RGB Substring (hard version) --- 前缀和 + 思维
    康托展开
    POJ1821 Fence --- 单调队列 + DP
    素数筛
    自动化接口面试遇到的问题
    linux遇到的面试问题
  • 原文地址:https://www.cnblogs.com/dshn/p/8711213.html
Copyright © 2011-2022 走看看