Javascript Can';数组反向算法问题的求解

Javascript Can';数组反向算法问题的求解,javascript,arrays,algorithm,reverse,Javascript,Arrays,Algorithm,Reverse,我有一个要求,即我必须在不更改数组中出现的“#”索引的情况下反转数组,如下例所示: 数组[18,-4',#',0,8',#',5]应返回[5,8,“#”,0,-4,“#”,18],在保持相同索引的情况下,数字应反转,不包括“#” 我试图获得正确的输出,但并非在所有情况下都是正确的: var arr=[18,-4',0,8',5];//给出的结果是正确的 var arr1=[18,-4,0',8',5];//结果不正确 var reverse=函数(数字、开始、结束){ var temp=数

我有一个要求,即我必须在不更改数组中出现的“#”索引的情况下反转数组,如下例所示:

  • 数组
    [18,-4',#',0,8',#',5]
    应返回
    [5,8,“#”,0,-4,“#”,18]
    ,在保持相同索引的情况下,数字应反转,不包括“#”
我试图获得正确的输出,但并非在所有情况下都是正确的: var arr=[18,-4',0,8',5];//给出的结果是正确的 var arr1=[18,-4,0',8',5];//结果不正确

var reverse=函数(数字、开始、结束){
var temp=数字[开始];
数字[开始]=数字[结束];
数字[结束]=温度;
}
var flip=函数(数字){
var start=0;
var end=number.length-1;
对于(var i=0;i
var arr=[18,-4',0,8',5]
var stack=[]

对于(i=0;i您可以简化函数,只使用两个索引,开始和结束,并检查索引处的值是否应该保留,然后选择另一个索引进行交换

const
交换=(数组,a,b)=>[array[a],array[b]]=[array[b],array[a]],
翻转=数字=>{
var start=0,
结束=数字。长度-1;
while(开始<结束){
如果(数字[开始]=='#'){
启动++;
继续;
}
如果(数字[结束]=='#'){
结束--;
继续;
}
交换(数字,开始++,结束--);
}
返回号码;
},
数组1=[18,-4',0,8',5],
array2=[18,-4,0',8',5];
console.log(…flip(array1));
console.log(…flip(array2));
您可以尝试以下方法:

var numbers=arr.filter(a=>a!='#')
var revArr=[];
arr.forEach((当前值)=>{
如果(currentValue!==“#”){
revArr.push(numbers.pop());
}否则{
重新进行推送(“#”)操作;
}
});

你可以这样做

        int end = v.length - 1;
        int start = 0;
        for (int i = 0; i < v.length >> 1; i++) {
            if (v[start].equals("#")) {
                start++;
                continue;
            }
            if (v[end].equals("#")) {
                end--;
                continue;
            }
            Object temp = v[end];
            v[end] = v[start];
            v[start] = temp;
            end--;
            start++;

        }
        System.out.println(Arrays.toString(v));
int end=v.length-1;
int start=0;
对于(int i=0;i>1;i++){
if(v[start].equals(“#”){
启动++;
继续;
}
if(v[end].等于(“#”){
结束--;
继续;
}
对象温度=v[结束];
v[结束]=v[开始];
v[启动]=温度;
结束--;
启动++;
}
System.out.println(Arrays.toString(v));

简单的方法是删除所有
'#'
,使用内置的
[]反转数组。反转
方法,然后重新插入
'#'

let flip=number=>{
让删除=数字。减少((r,v,i)=>
v=='#'?r.concat(i):r
, []);
让反转=数字。过滤器(v=>v!='#')。反转();
移除.forEach(i=>反向.拼接(i,0,#');
反向返回;
};
设arr=[18,-4',0,8',5];
设arr1=[18,-4,0',8',5];
控制台日志(翻转(arr));

console.log(flip(arr1));
您可以将算法基于两个基本数组(倒数数组和带“#”保存位置的数组)

const数组=[5,8,“#”,0,-4,“#”,18];
函数翻转(数组){
常量arrayNumbers=array.filter((el,index)=>el!==“#”).reverse();
var计数器=0;
返回array.map(el=>el===“#”).map(el=>{
如果(!el){
设num=arrayNumbers[计数器];
计数器=计数器+1;
返回num;
}否则{
返回“#”
}
})
}

console.log(翻转(数组))
请注意,问题要求的是
反向
,而不是
排序
,谢谢@G.aziz的努力,但我需要在不使用过滤器的情况下实现它,它可以简化吗?@SarveshMahajan:用自定义循环替换
过滤器和
映射
,这与简化相反。可能是现在,但不是更早OP更改了标签。谢谢@sagar的努力,没有过滤器可以简化吗?谢谢@junvar的努力,但我需要它,没有预定义的函数,我想使用循环的基本逻辑或其他东西,可以简化吗?@SarveshMahajan:除非这是家庭作业,或者你有一些非常严重的性能限制,我会建议使用
filter
concat
reduce
等比自定义循环更容易读取代码。
        int end = v.length - 1;
        int start = 0;
        for (int i = 0; i < v.length >> 1; i++) {
            if (v[start].equals("#")) {
                start++;
                continue;
            }
            if (v[end].equals("#")) {
                end--;
                continue;
            }
            Object temp = v[end];
            v[end] = v[start];
            v[start] = temp;
            end--;
            start++;

        }
        System.out.println(Arrays.toString(v));