【问题标题】:Insert at front of array [duplicate]在数组前面插入[重复]
【发布时间】:2020-01-26 10:55:08
【问题描述】:

有没有办法在数组的前面插入一个元素?有人告诉我,除了使用圆形数组之外,还有一种方法。我们需要像检索和添加这样的操作是 O(1) 时间,所以像 ArrayUtil 这样的事情是不可能的。 IE。需要一个原始数组。

编辑:线程“Java Arrays 如何在开头添加元素”没有任何遵循原始数组的方法,解决方案都是使用列表或其他类似 ArrayUtil 的东西。

【问题讨论】:

  • LinkedList 可能工作
  • 不是在数组中,而是在另一个结构中,比如链表。将一个元素添加到数组的开头是 O(N),因为您必须调整所有其他元素的位置,或者将内容复制到新数组。
  • StackOverflow 不是代码编写服务。该站点的目的是帮助解决特定的代码问题。那么您编写了哪些代码,您在使用该代码时遇到了哪些问题?
  • 使用数组列表。 List有方法add(index, E),所以可以使用:list.add(0, yourObject);

标签: java arrays


【解决方案1】:

Java 数组具有“固定”大小。没有开箱即用的“添加”。添加总是意味着:增加数组的长度,因此:创建一个新数组并复制现有数据。

达到 O(1) 的唯一解决方案是查看一些“链表”,例如数组的实现,其中添加/插入元素仅仅是调整“指针”。

【讨论】:

    【解决方案2】:

    在数组的开头插入需要将所有其他元素向右移动并删除最后一个元素。这意味着对于给定大小的数组,它在时间上是一致的(数组越长,它需要的时间越长)。如果您要维护数组中 used 条目的计数,则需要更长的时间,具体取决于有多少 used 条目(因为您不必移动未使用的)。 (我认为意味着它不符合您的 O(1) 要求,但我从未真正接触过 Big-O 表示法......)

    听起来您可能想要一个链表或环形缓冲区。

    【讨论】:

      【解决方案3】:

      由于 java 数组是固定大小的,所以无论如何您都需要一个索引(以指示长度)。

      您拒绝“循环”数组可能是一个错误。

      final int N = 64;
      String[] data = new String[N];
      int start = 0;
      int end = 0; // Exclusive.
      
      int size() {
          return (end - start + N) % N;
      }
      
      String get(int i) {
          checkIndex(i);
          int j = (start + i) % N;
          return data[j];
      }
      
      void prepend(String s) {
          checkNotFull();
          start = (start - 1 + N) % N;
          data[start] = s;
      }
      

      一般数据结构如 Deque、ArrayDeque、LinkedList 等都是常用的。

      【讨论】:

        猜你喜欢
        • 2021-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-04
        • 1970-01-01
        • 2023-04-02
        • 2018-09-15
        • 2013-10-24
        相关资源
        最近更新 更多