好久没看leetcode,早上看了下昨天的每日一题,题目如下:
给你一个数组 target 和一个整数 n。每次迭代,需要从 list = { 1 , 2 , 3 …, n } 中依次读取一个数字。
请使用下述操作来构建目标数组 target :
“Push”:从 list 中读取一个新元素, 并将其推入数组中。
“Pop”:删除数组中的最后一个元素。
如果目标数组构建完成,就停止读取更多元素。
题目数据保证目标数组严格递增,并且只包含 1 到 n 之间的数字。
请返回构建目标数组所用的操作序列。如果存在多个可行方案,返回任一即可。
写博客的时候,翻看了下csdn上的数学公式参考案例,感觉写个公式还真不容易,捣鼓了一下那个案例,如下,猜猜这是什么公式;
f
(
x
)
=
∫
0
∞
t
x
−
1
e
−
t
d
t
.
f(x) = \int_0^\infty t^{x-1}e^{-t}dt\,.
f(x)=∫0∞tx−1e−tdt.
回到正题,分享一下代码;
public List<String> buildArray(int[] target, int n) {
//临时存储 [1,n]的数据
List<Integer> list = new ArrayList();
//最终返回结果
List<String> result = new ArrayList();
for(int i = 1;i <=n;i++){
list.add(i);
}
int j =0;
for(int i =0;i < target.length;i++){
if(target[i] != list.get(j)){
result.add("Push");
result.add("Pop");
i--;
}else{
result.add("Push");
}
j++;
if(j > list.size()-1){
break;
}
}
return result;
}
这里使用list临时数组也是为了好理解,也可以直接用j代替数字,代码如下:
public List<String> buildArray(int[] target, int n) {
List<String> result = new ArrayList();
int j =1;
for(int i =0;i < target.length;i++){
if(target[i] != j){
result.add("Push");
result.add("Pop");
i--;
}else{
result.add("Push");
}
j++;
if(j > n){
break;
}
}
return result;
}