给你一个数组 target
和一个整数 n
。每次迭代,需要从 list = { 1 , 2 , 3 ..., n }
中依次读取一个数字。
请使用下述操作来构建目标数组 target
:
"Push"
:从list
中读取一个新元素, 并将其推入数组中。"Pop"
:删除数组中的最后一个元素。- 如果目标数组构建完成,就停止读取更多元素。
题目数据保证目标数组严格递增,并且只包含 1
到 n
之间的数字。
请返回构建目标数组所用的操作序列。如果存在多个可行方案,返回任一即可。
示例 1:
输入:target = [1,3], n = 3 输出:["Push","Push","Pop","Push"] 解释: 读取 1 并自动推入数组 -> [1] 读取 2 并自动推入数组,然后删除它 -> [1] 读取 3 并自动推入数组 -> [1,3]
示例 2:
输入:target = [1,2,3], n = 3 输出:["Push","Push","Push"]
示例 3:
输入:target = [1,2], n = 4 输出:["Push","Push"] 解释:只需要读取前 2 个数字就可以停止。
提示:
1 <= target.length <= 100
1 <= n <= 100
1 <= target[i] <= n
target
严格递增
我们定义 list
中读取到的数字,初始时
遍历数组 target
,对于每个数字 list
读取的数字小于 Push
和 Pop
操作,直到读取的数字等于 Push
操作,这样就可以得到数字
遍历结束后,也就构建出了数组 target
,返回 ans
即可。
时间复杂度 target
的长度。忽略答案的空间消耗,空间复杂度
class Solution:
def buildArray(self, target: List[int], n: int) -> List[str]:
cur, ans = 0, []
for v in target:
cur += 1
while cur < v:
ans.extend(['Push', 'Pop'])
cur += 1
ans.append('Push')
return ans
class Solution {
public List<String> buildArray(int[] target, int n) {
int cur = 0;
List<String> ans = new ArrayList<>();
for (int v : target) {
while (++cur < v) {
ans.add("Push");
ans.add("Pop");
}
ans.add("Push");
}
return ans;
}
}
class Solution {
public:
vector<string> buildArray(vector<int>& target, int n) {
int cur = 0;
vector<string> ans;
for (int& v : target) {
while (++cur < v) {
ans.emplace_back("Push");
ans.emplace_back("Pop");
}
ans.emplace_back("Push");
}
return ans;
}
};
func buildArray(target []int, n int) []string {
cur := 0
ans := []string{}
for _, v := range target {
for cur = cur + 1; cur < v; cur++ {
ans = append(ans, "Push", "Pop")
}
ans = append(ans, "Push")
}
return ans
}
function buildArray(target: number[], n: number): string[] {
const res = [];
let cur = 0;
for (const num of target) {
while (++cur < num) {
res.push('Push', 'Pop');
}
res.push('Push');
}
return res;
}
impl Solution {
pub fn build_array(target: Vec<i32>, n: i32) -> Vec<String> {
let mut res = Vec::new();
let mut cur = 1;
for &num in target.iter() {
while cur < num {
res.push("Push");
res.push("Pop");
cur += 1;
}
res.push("Push");
cur += 1;
}
res.into_iter().map(String::from).collect()
}
}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
char** buildArray(int* target, int targetSize, int n, int* returnSize) {
char** res = (char**) malloc(sizeof(char*) * n * 2);
int cur = 1;
int i = 0;
for (int j = 0; j < targetSize; j++) {
while (++cur < target[j]) {
res[i] = (char*) malloc(sizeof(char) * 8);
strcpy(res[i++], "Push");
res[i] = (char*) malloc(sizeof(char) * 8);
strcpy(res[i++], "Pop");
}
res[i] = (char*) malloc(sizeof(char) * 8);
strcpy(res[i++], "Push");
}
*returnSize = i;
return res;
}