输入
console.log(removeOne([]));
console.log(removeOne([1, 3, 1, 2, 1]));
console.log(removeOne([1, 4, [1, 5, 1, 2]]));
console.log(removeOne([1, 1, [1, 3, [1, 1, 4, 1], 2]]));
输出
[]
[ 3, 2 ]
[ 4, [ 5, 2 ] ]
[ [ 3, [ 4 ], 2 ] ]
function removeOne(ary) {
let result=[];
let stateu=[];
let statej=[];
for(let i=0;i<ary.length;i++){
if(ary[i] instanceof Array){
let tmp=[]
let tmp1=[]
let j=ary[i].slice();
for(let u=0;u<j.length;u++){
console.log("u "+u);
if(j[u] instanceof Array){
stateu.push(u);
statej.push(j);
j=j[u];
u=-1;
result.push(tmp);
tmp=[];
}
else if(j[u]!=1){
tmp.push(j[u]);
console.log("j "+j);
if((u+1)==j.length){
result.push(tmp);
}
}
else if((u+1)==j.length){
j=statej.pop();
u=stateu.pop();
console.log("j[u] "+j);
}
}
}
else if(ary[i]!=1)
result.push(ary[i]);
}
return result;
}
1.我花了很多时间思考,我已经用递归实现了它。但是如何通过使用循环来完全填充呢?
2.必须使用JavaScript来实现。
//在这里更新。
3.实现了非递归结果的基本原型。
4.stateu和statej是两个类似的堆栈,只需使用push和pop将之前的u和j存储为ary[0,1,..n]属于Array。
5.我设置u=-1,因为下一轮u将加1。然后转到新的嵌套数组。
6.j=ary[i],其可以被处理为特定的数组并用于循环。
7.有人能调整我的代码以获得正确的答案吗?
一种"黑客攻击";方法
在couse中,字符串和解析的引擎盖下有递归
const removeOne = (coll) => JSON.parse(
JSON.stringify(coll)
.replaceAll('1,', '')
.replaceAll(',1', '')
);
console.dir(removeOne([1, 1, [1, 3, [1, 1, 4, 1], 2]]), {depth: null});
//[ [ 3, [ 4 ], 2 ] ]