将Arraylist的平方元素添加到Arraylist中

时间:2017-10-01 23:17:36

标签: java arraylist

我正在尝试将平方元素添加回原始的arraylist中。例如[1,2,3]应该变为[1,1,2,4,3,9]。我的问题是我不确定我的机器是不是很糟糕,因为我收到内存不足的错误。这是我的尝试。递归调用只是为了获得arraylist的总和。

public static int sumOfSquares(List<Integer> num) {


    if (num.isEmpty()) {
        return 0;
    }
    for(int i=0; i<num.size();i++){
        int hold= num.get(i)*num.get(i);
        num.add(hold);
    }


    return num.get(0) + sumOfSquares(num.subList(1, num.size()));
}

2 个答案:

答案 0 :(得分:1)

您的实施问题在于它不会将原始数字与您之前添加的方格区分开来。

首先,由于您以递归方式执行此操作,因此您不需要for循环。每次调用都需要单独处理列表的初始值。

接下来,add(n)在末尾添加数字,而您的示例显示在原始值之后立即添加数字。因此,您应该使用num.add(1, hold),并在进行递归调用时跳过两个初始数字。

以下是固定方法的外观:

public static int sumOfSquares(List<Integer> num) {
    if (num.isEmpty()) {
        return 0;
    }
    // Deal with only the initial element
    int hold= num.get(0)*num.get(0);
    // Insert at position 1, right after the squared number
    num.add(1, hold);
    // Truncate two initial numbers, the value and its square:
    return num.get(1) + sumOfSquares(num.subList(2, num.size()));
}

Demo.

答案 1 :(得分:0)

在迭代时,有两种方法可以安全地添加(或删除)元素到列表中:

  1. 在列表上向后迭代,以便即将发布的元素的索引不会移位。

  2. 使用IteratorListIterator

  3. 您可以使用任一策略修复代码,但我建议使用ListIterator来获取可读代码。

    import java.util.ListIterator;
    
    public static void insertSquares(List<Integer> num) {
        ListIterator<Integer> iter = num.listIterator();
        while (iter.hasNext()) {
            int value = iter.next();
            iter.add(value * value);
        }
    }
    

    然后,将求和代码移动到单独的方法中,以便递归不会干扰将正方形插入列表。您的递归解决方案将起作用,但迭代解决方案对Java更有效。