【问题标题】:how can I reverse my array using only one Array instead of using two?如何仅使用一个数组而不是两个数组来反转我的数组?
【发布时间】:2020-04-06 16:40:21
【问题描述】:

我对 JavaScript 和一般编程相当陌生。 我正在尝试使用一些代码来使用 push 和 Pop 反转数组。我知道我可以使用 Array.prototype.reverse() 但我想尝试一下。

这是我的问题

  • 1) 为什么我在最后一行代码中未定义?自从我回来 阵列?
  • 2) 为什么ReverseStack(stack,reversed.push(stack.pop())) 不是功能错误?
  • 3) 我怎样才能得到相同的结果但没有 使用第二个数组?仅使用推送和弹出

const stack = [];
const reversed = [];
stack.push("a");
stack.push("b");
stack.push("c");
stack.push("d");
stack.push("e");
stack.push("f");

ReverseStack = (stack, reversed) =>{

    for(let i = 0; i <= stack.length; i++) {
        if (stack.length === 0){
            console.log(reversed); //output [ 'f', 'e', 'd', 'c', 'b', 'a' ]
            return reversed
        }
        else{
            reversed.push(stack.pop()); //store popped item in poppedItems
            ReverseStack(stack,reversed)

            //why the below does not work? it says reversed.push is not a function
            //ReverseStack(stack,reversed.push(stack.pop()))
        }
    }
};

console.log(ReverseStack(stack, reversed)); //output undefined ? why is that

【问题讨论】:

    标签: javascript arrays stack reverse


    【解决方案1】:

    因为 return 语句在 if 块内,而不是在 if-else 块外。因此,最后的函数ReverseStack 将返回一个隐含的undefined 值。

    我认为您不需要记录/返回函数 ReverseStack 的结果,因为您正在修改内存中的数组 reversed

    const stack = [];
    const reversed = [];
    stack.push("a");
    stack.push("b");
    stack.push("c");
    stack.push("d");
    stack.push("e");
    stack.push("f");
    
    let ReverseStack = (stack, reversed) => {
      for (let i = 0; i <= stack.length; i++) {
        if (stack.length !== 0) {
          reversed.push(stack.pop());
          ReverseStack(stack, reversed);
        }
      }
    };
    
    ReverseStack(stack, reversed);
    console.log(reversed);

    【讨论】:

      【解决方案2】:

      1) 为什么我在最后一行代码中未定义?自从我返回了数组?

      你的函数是递归的。尽管您在最终条件下返回 reversed,但在输入 else 语句时您不会返回任何内容。您需要在else 中返回递归调用,以使返回值向上渗透回ReverseStack 的外部调用者:

      const stack = [];
      const reversed = [];
      stack.push("a");
      stack.push("b");
      stack.push("c");
      stack.push("d");
      stack.push("e");
      stack.push("f");
      
      ReverseStack = (stack, reversed) =>{
      
          for(let i = 0; i <= stack.length; i++) {
              if (stack.length === 0){
                  console.log(reversed); //output [ 'f', 'e', 'd', 'c', 'b', 'a' ]
                  return reversed
              }
              else{
                  reversed.push(stack.pop()); //store popped item in poppedItems
                  return ReverseStack(stack,reversed)
      
                  //why the below does not work? it says reversed.push is not a function
                  //ReverseStack(stack,reversed.push(stack.pop()))
              }
          }
      };
      
      console.log(ReverseStack(stack, reversed)); //output undefined ? why is that

      2) 为什么 ReverseStack(stack,reversed.push(stack.pop())) 不是函数错误?

      因为.push返回的是数组的新长度,而不是变异后的数组,所以递归调用了

      ReverseStack(stack,reversed.push(stack.pop()))
      

      使用两个参数调用ReverseStack:一个数组和一个整数。但是该函数期望第二个参数是一个数组。

      3) 如何在不使用第二个数组的情况下获得相同的结果?仅使用推送和弹出

      不使用另一个数组或数据结构并且只使用pushpop 可能很困难,也许不可能(尽管证明我错了,但我想不出办法)。使用索引的另一种方法是从中间进行迭代:- 切换,例如,索引 2 和 3,然后是 1 和 4,然后是 0 和 5,没有递归:

      const stack = [];
      stack.push("a");
      stack.push("b");
      stack.push("c");
      stack.push("d");
      stack.push("e");
      stack.push("f");
      
      ReverseStack = (stack) => {
        for (let i = Math.ceil((stack.length - 1) / 2); i < stack.length; i++) {
          [stack[i], stack[stack.length - i - 1]] = [stack[stack.length - i - 1], stack[i]]
        }
        return stack;
      };
      
      console.log(ReverseStack(stack));

      【讨论】:

      • 仅供参考使用 push 和 Pop 反转数组
      【解决方案3】:

      你可以这样使用:

      想法:

      • 删除第一项并保存。
      • 对剩余项目重复该过程,直到长度为 1。
      • 将存储的值推送到返回的数组中。

      注意:

      • Array.popStack.pop 不同。 Array.pop 删除最后一个元素,Stack.pop 首先删除。您可以为此使用Array.shift

      以下是一个示例:

      const stack = [];
      stack.push("a");
      stack.push("b");
      stack.push("c");
      stack.push("d");
      stack.push("e");
      stack.push("f");
      
      ReverseStack = (stack) => {
        if (stack.length > 1) {
          const head = stack.shift();
          const reverse = ReverseStack(stack);
          reverse.push(head)
          return reverse;
        }
        return stack;
      };
      
      console.log(ReverseStack(stack.slice()));

      【讨论】:

      • 这会创建一堆中间数组。但我不确定通用解决方案是否可行,除非创建至少一个中间数组使用push/pop以外的其他东西
      • @CertainPerformance 是的,它创建了中间数组,但由于引用,我遇到了很多问题,因此更喜欢使用这种方法。
      猜你喜欢
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      相关资源
      最近更新 更多