2017-10-01 11 views
1

원래 arraylist에 제곱 요소를 다시 추가하려고합니다. 예를 들어 [1,2,3]은 [1, 1, 2, 4, 3, 9]가되어야합니다. 내 문제는 메모리 부족 오류가 발생하여 내 컴퓨터가 불량인지 잘 모릅니다. 여기 내 시도입니다. 재귀 호출은 arraylist의 합계를 얻는 것입니다.Arraylist의 제곱 요소를 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

'for' 루프는'num'에 추가하기 때문에 무한 루프입니다.'num'은 루프를 끝내지 않게하는'size()'를 증가시킵니다. – 4castle

+0

각 루프마다 더 좋을까요? –

+0

아마 그렇게해서는 안됩니다. 사각형의 합을 얻기 위해 목록을 왜 돌연변이시키는 것입니까? 필요한 경우 단계를 구분하십시오. – ChiefTwoPencils

답변

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.

0

을 반복하면서 안전하게 목록에 요소를 추가하거나 제거하는 방법에는 두 가지가 있습니다

  1. 다음 요소의 인덱스가 이동하지 않도록 목록을 거꾸로 반복합니다.

  2. Iterator 또는 ListIterator을 사용하십시오.

전략을 사용하여 코드를 수정할 수 있지만 읽을 수있는 코드로는 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에 더 효율적입니다.

관련 문제