Ограничение по времени: 1000 мс
Лимит памяти: 256M
Описание темы:
Сяоцин любит играть в игры и наблюдать за рыночной ценой оборудования, но цена оборудования не фиксируется каждый день. Пожалуйста, обновите список на основе ежедневного прайс-листа оборудования, и вывод соответствующей позиции должен быть: для того, чтобы наблюдать более высокую цену оборудования, по крайней мере, количество дней ожидания. Если после этого цена предмета не поднимется, используйте вместо этого 0.
Введите описание:
массив цен
Описание выхода:
набор дней для наблюдения
Пример:
Пример 1
войти
73,74,75,71,69,72,76,73
выход
1,1,4,2,1,1,0,0
Пример 2
войти
30,40,50,60
выход
1,1,1,0
намекать
1 <= priceList.length <= 105
30 <= список цен[i] <= 100
Взлом методом грубой силы получает полбалла
анализ случая:
Этот вопрос в основном исследует природу стека
Есть метод stack.peek() : может вернуться к верхнему элементу, но не удаляет верхний элемент
Идеи:
-
Откройте массив для хранения количества дней
-
открыть очередь
-
В стек запихивается индекс первого элемента, а затем сравнивается размер более позднего
stack[进栈的坐标]
иstack[栈顶坐标]
размер, если он больше вершиныstack
стека , то обновляется массив дней, записывается разница в днях и удаляется верхний элемент стека (pop()) (короче говоря, если он меньшеstack[进栈的]
, удалите его, если он большеstack[进栈的]
, нажмите егоstack[进栈的]
)
демо
Код:
package 装备价格;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;
/**
* @author 江七
* @version 1.0
* @date 2021/9/30 14:39
*/
public class Main {
public static void main(String[] args) {
// 如果有其他情况需要判断 可修改示例代码
Scanner cin = new Scanner(System.in);
String str1 = cin.next();
String[] split1 = str1.split(",");
int[] arr = new int[split1.length];
for (int i = 0; i < split1.length; i++) {
arr[i] = Integer.parseInt(split1[i]);
}
int[] dayArr = dailyPrice(arr);
String result = "";
for (int day : dayArr) {
result += day + ",";
}
System.out.println(result.substring(0, result.length() - 1));
}
// 请补齐方法
public static int[] dailyPrice(int[] priceArray) {
Stack<Integer> stack = new Stack<>(); //使用
int length = priceArray.length;
int[] res = new int[length];
for(int i=0;i < length;i++){
while(stack.size()!=0 && priceArray[stack.peek()] < priceArray[i]){
res[stack.peek()] = i-stack.pop();
}
stack.push(i);
}
return res;
}
}