【问题标题】:Copying elements from arrays [closed]从数组中复制元素[关闭]
【发布时间】:2021-11-27 13:52:04
【问题描述】:

我是计算机科学的新手。我被告知在以下 Java 类型伪代码中只有 1 个错误,但我无法弄清楚。不是有1个以上吗?首先 if 语句意味着它不会循环,因为大小不等于最大大小,但我认为循环也不正确,因为 i

private int size = 0;
private int maxsize = 16;
private int[] arr = new int[maxsize];

public void append(val, list)
{
    if (size == maxsize)
    {
        int[] newArr = new int[maxsize * 2];
        for (i = 0; i <= size ; i++)
            newArr[i] = arr[i];
        arr = newArr;
        maxsize = maxsize*2;
    }
    arr[size++] = val;
}

在这些选项中,哪一个是正确的?

  • 第 1 行应为:private int size = 16;
  • 第 7 行应为:if (size &gt; maxsize)
  • 第 10 行应为:for (i = 0 ; i &lt;= maxsize ; i++)
  • 第 13 行应该在第 10 行之前
  • 第 15 行应为:arr[++size] = val;

【问题讨论】:

  • 看循环后的代码。还要想想sizemaxSize 代表什么。在循环条件不正确但出于错误原因的情况下,您处于正确的轨道上。想想当size == maxSize 并且您想要访问原始数组时,i == size 会发生什么。
  • 我实际上看到了 1 个错误和 1 个潜力,但在代码中,但没有一个解决方案可以解决任何这些问题......
  • size在这里作为数组的索引,所以它从0开始,每次递增。因此,当它变为 16 时,表示数组中有 16 个元素,最后一个索引为 15,即 arr[15]。正如@Thomas 所指出的,当i==size 表示arr[16] 时,这将导致ArrayIndexOutOfBoundsException。而不是for(i=0; i &lt;= size ;i++),它应该是for(i=0; i &lt; size ;i++),但它不在选项中。
  • 根据您获得选项的方式以及您的反应方式,他们可能会试图让您失望(即您不应该依赖多项选择)并期望您回答“无这些选项中的一个修复了错误”——这就是我对实习生和学生所做的;)
  • 投反对票,因为这与来自同一 OP 的 stackoverflow.com/questions/69472849/… 相同

标签: java arrays loops for-loop pseudocode


【解决方案1】:

好的,让我们稍微分析一下伪代码。鉴于这是伪代码,我们不会关注语法错误,而是关注逻辑错误(或设计问题)。

首先,这看起来像是一个数组列表的实现,即在内部它保留一个数组,如果需要更多空间,它会加倍。它还将列表的当前大小保持为size

//this is ok since at tehe beginning there are no elements in the array
private int size = 0; 

//initial capacity of the array, ok too
private int maxsize = 16; 

//an array of elements with value 0, ok too
private int[] arr = new int[maxsize]; 

//ok but a potential bug: what is list used for?
public void append(val, list) 
{
    //if the size of the list hits the capacity, we need to increase space, so this is ok
   if (size == maxsize)
   {
      //we create a new array with 2x the previous size, ok as well
      int[] newArr = new int[maxsize * 2]; 

      //we're looping and copying the elements from the old array to the new one
      //bug: for i == size it would try to access arr[size] which is out of bounds
      //fix: use i < size or even i < maxsize if you have to
      for (i = 0; i <= size ; i++) 
        newArr[i] = arr[i];

      //move the references to "point" to the new array - ok
      arr = newArr;

      //double capacity - could have been better but ok here
      maxsize = maxsize*2;
   }

   //add a new element at the index right after the last (i.e. size) and increase size by 1
   arr[size++] = val;
}

现在选项:

第 1 行应为:private int size = 16;

这将导致数组在添加第一个元素时加倍,并导致前 16 个元素为“空”(0)。而且它不会修复错误。

第 7 行应为:if (size &gt; maxsize)

这不应该是真的,因为arr[size++] 会在size == maxsize 时抛出异常。它也不会修复错误。

第 10 行应为:for (i = 0 ; i &lt;= maxsize ; i++)

这与for (i = 0 ; i &lt;= size ; i++) 基本相同,因为它仅在size == maxsize 时执行。它包含相同的错误并且没有修复它。

第 13 行应该在第 10 行之前

如果我正确识别了代码行,这不会有太大变化:

int[] newArr = new int[maxsize * 2];
maxsize = maxsize*2;
for (i = 0; i <= size ; i++)
    newArr[i] = arr[i];
arr = newArr;

如果您更改代码,您可以摆脱一个计算:

maxsize = maxsize*2;
int[] newArr = new int[maxsize];

为了提高可理解性,最好下注:

int newMaxSize = maxsize * 2;
int[] newArr = new int[newMaxSize];

for (i = 0; i <= size ; i++)
    newArr[i] = arr[i];
arr = newArr;
//could be before the loop as well but it's safer to set it here, e.g. someone could change the loop to "for (i = 0; i < maxsize ; i++)" ;)

maxsize = newMaxSize;

第 15 行应为:arr[++size] = val;

这将使第一个元素(在索引 0 处)“空”(0)并且会中断 size == maxsize-1。不修复错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-06
    • 2013-04-19
    • 2021-04-10
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    相关资源
    最近更新 更多