Я новичок в 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();
}
Что нужно сделать (и идеи, которые у меня были до сих пор, чтобы решить это)
Создайте скользящее окно w, которое может быть создано с размером окна n:
SlidingWindow w = New SlidingWindow (n)//Это то, что претит меня больше всего - это саморасширяющийся массив? Связанный список?
Метод ввода Put, который принимает целочисленные числа и не имеет возвращаемого значения:
public static void Put (int value) {//реализация будет зависеть от SlidingWindow
Метод Max и Min для возврата min и max самых последних входов. Это я просто сделаю, ища мин и макс.
Если количество входов превышает размер окна, самый старый элемент должен быть отброшен.
Извините за неопределенность вопроса - мы никогда не сталкивались с окнами в классе (через несколько недель я узнал что-нибудь о кодировании), поэтому я действительно в тупике. Я огляделся по интернету за некоторыми ресурсами, но еще не нашел ничего подходящего, чтобы помочь мне.
Если у вас есть какие-либо идеи или советы, чтобы предложить, как создать SlidingWindow w, я думаю, что это поможет мне на правильном пути!
Заранее спасибо!
Для скользящего окна самым простым может быть счетчик для числа вставки. Как это:
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++;
}
}
Таким образом, вы можете использовать массив фиксированного размера и заменить старое значение более новыми, как только массив будет заполнен, без изменения содержимого.
counter % storage.length
рассчитывает от 0 до storage.length
и начинает снова с 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
Я только оставил проверку длины окна не должен быть больше, чем массив.