制限時間:1000ms
メモリ制限:256M
トピックの説明:
Xiaoqingはゲームをしたり、機器の市場価格を観察したりするのが好きですが、機器の価格は毎日固定されているわけではありません。毎日の機器価格リストに基づいてリストを再生成してください。対応するポジションの出力は次のようになります。より高い機器価格を監視するには、少なくとも待機日数。それでもアイテムの価格が上がらない場合は、代わりに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 <= priceList [i] <= 100
ブルートフォースクラッキングは半分のポイントを取得します
ケース分析:
この質問は主にスタック
メソッドstack.peek()があります:最上位の要素に戻ることができますが、最上位の要素は削除されません
アイデア:
-
配列を開いて日数を保存します
-
dequeを開く
-
最初の要素の添え字がスタックにプッシュされ、後のサイズ
stack[进栈的坐标]
とされstack[栈顶坐标]
ます。stack
スタック、days配列を更新し、日数の差を記録して、スタックの最上位要素(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;
}
}