【问题标题】:Deque last element insert.Deque 最后一个元素插入。
【发布时间】:2019-05-05 02:14:25
【问题描述】:

数据结构推理。

前面插入值的方法:

工作正常。

 public void insertLeft(Item item) {       
       if (size == deque.length){
          resize(2 * deque.length);
      }
      deque[start] = item;
      start++;
      size++;
}

在尾部插入值的方法 - 因为这一行 //end = deque.length - 1; 覆盖最后一个元素

public void insertRight(Item item) {
    if (size == deque.length){
        resize(2 * deque.length);
    }
    end = deque.length - 1;
    deque[end++] = item;
    end %= deque.length;
    size++;
}

我该如何解决?

【问题讨论】:

    标签: java algorithm deque


    【解决方案1】:

    假设数组大小为 10,当前有 3 个值:

    _ _ _ 1 2 3 _ _ _ _
          ^     ^
      start     end
    

    如您所见,您的insertLeft 方法是错误的:

    • 它将替换现有值
    • 它将索引移动到错误的方向
    • 它不处理环绕

    而你的insertRight 方法是错误的:

    • 它丢弃了end

    重新思考你在做什么,例如resize() 方法是否处理数组已包装的情况?

    例子:

    3 4 5 _ _ _ _ _ 1 2
          ^         ^
        end         start
    

    如果你拨打insertRight() 5 次,你会得到:

    3 4 5 X X X X X 1 2
                    ^
                    start
                    end
    

    第 6 次调用 insertRight() 会触发 resize(),但它会正确处理吗?例如。结果:

    3 4 5 X X X X X Y _ _ _ _ _ _ _ _ _ 1 2
                      ^                 ^
                      end               start
    

    【讨论】:

      【解决方案2】:

      deque.length - 1 正在返回最后一个变量的索引。你必须克服这一点:

      deque[++end] = item;

      【讨论】:

      • 并获取java.lang.ArrayIndexOutOfBoundsException: 因为它将链接到不存在的元素;
      • 似乎是一个调整大小的问题。你是什​​么意思不链接现有元素
      • deque.length - 1 是双端队列中的最后一个元素。此元素 deque[++end] 不存在。
      • 这不是 resize 的作用吗?您是要替换最后一个元素还是追加一个元素?
      • 尽量不替换最后一个元素,并在前一个索引上追加下一个元素
      猜你喜欢
      • 2015-01-16
      • 2021-10-31
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      相关资源
      最近更新 更多