实现滑动窗口(java)

时间:2015-04-10 14:50:32

标签: java arrays linked-list sliding-window

我对java(以及整体编程)相当新,并且已经收到了从头到尾实现Sliding Window对象的任务。骨架代码如下:

import java.util.Scanner;

//implement class SlidingWindow

class Main {

// this is the test code for the judge, do not modify
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int windowSize = scanner.nextInt();
    SlidingWindow window = new SlidingWindow(windowSize);
    while (scanner.hasNextInt())
    {
        int value = scanner.nextInt();
        window.Put(value);
        System.out.println("[" + window.Min() + " " + window.Max() + "]");
    }
    scanner.close();
}

需要做些什么(以及我迄今为止解决它的想法)

  • 创建一个可以使用窗口大小n实例化的滑动窗口w:

    SlidingWindow w = New SlidingWindow(n)//这是最让我感到烦恼的是 - 它是一个自我增长的阵列吗?链表?

  • 输入方法Put接受整数并且没有返回值:

    public static void Put(int value){//实现将取决于SlidingWindow

  • 最大和最小方法,用于返回最近输入的最小值和最大值。我将通过寻找最小值和最大值来做到这一点。

  • 如果输入的数量超过窗口的大小,则应丢弃最旧的元素。

对不起这个问题的模糊性 - 我们从来没有在课堂上处理过窗口问题(我在学习编码方面需要几周时间),所以我真的很难过。我在网上浏览了一些资源,但还没有找到适合帮助我的东西。

如果您对如何创建SlidingWindow w有任何想法或建议,我认为这将使我走上正轨!

提前致谢!

2 个答案:

答案 0 :(得分:10)

对于滑动窗口,最简单的可能是插入数量的计数器。像这样:

class Window{
    int ct = 0;
    int[] storage; 

    public Window(int size){
         storage = new int[size];
    }

    public void put(int i){
         storage[ct % storage.length] = i;
         ct++;
    }
}

这样,您可以使用固定大小的数组,并在数组填充后立即用较新的值替换最旧的数据,而不会移动内容。

答案 1 :(得分:0)

我特此提供一个简单而相对简单的解决方案。我正在给两个java文件的代码。

班级:

    public class Window {           
        public void getValue(int[] a, int w){   
            int t = 0;      
            for(int i=0;i<a.length;i++){
                if(i==a.length-w+1){
                    break;
                }else{
                    for(int j=i;j<i+w;j++){
                        if(t<a[j]){
                            t = a[j];
                        }
                    }
                }           
                System.out.println(t);
                t = 0;
            }
        }   
    }

主要方法:

    public class MainMethod {       
        public static void main(String[] args) {
            int[] a = new int[]{1, 3, -1, -3, 5, 3, 6, 7};
            int w = 3;
            Window ob = new Window();
            ob.getValue(a, w);
        }
    }


    Answer: 3 3 5 5 6 7

我只留下检查窗口的长度不应该大于数组。