我正在尝试将平方元素添加回原始的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()));
}
答案 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()));
}
答案 1 :(得分:0)
在迭代时,有两种方法可以安全地添加(或删除)元素到列表中:
在列表上向后迭代,以便即将发布的元素的索引不会移位。
您可以使用任一策略修复代码,但我建议使用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更有效。