Java에서 가변 길이 정수 배열을 0으로 카운트 다운

Mitchellmc

3 개의 파일에 총 줄 수를 포함하는 배열이 있습니다. 예 : [3,4,5]. 세 파일의 모든 줄 조합을 제공하는 체계적인 방법으로 해당 배열을 0으로 세는 일련의 숫자를 생성하고 싶습니다. 이 예제는 3 개 파일 / 길이 -3 배열을 사용하지만 알고리즘은 임의의 길이로 배열을 작동 할 수 있어야합니다.

위의 예에서 솔루션은 다음과 같습니다.

[3,4,5]  (line 3 from file 1, line 4 from file 2, line 5 from file 3)  
[3,4,4]  
[3,4,3]  
[3,4,2]  
[3,4,1]  
[3,4,0]  
[3,3,5]  
[3,3,4]  
[3,3,3]  
[3,3,2]  

등등...

이것에 대한 알고리즘을 생성하려는 첫 번째 시도는 배열의 위치를 ​​재귀 적으로 감소시키고 그 위치가 0에 도달하면 그 이전의 위치를 ​​감소시킵니다. 그러나 마지막 두 위치보다 더 많이 감소를 유지할 수 없습니다.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

    public class FilePositionGenerator {

        public static void main(String[] args) {
            int[] starterArray = {2, 2, 2};
            int[] counters = starterArray.clone();
            List<Integer> results = new ArrayList<Integer>();

            FilePositionGenerator f = new FilePositionGenerator();
            f.generateFilePositions(starterArray, counters, (starterArray.length - 1), results);
        }//end main

        void generateFilePositions(int[] originalArray, int[] modifiedArray, int counterPosition, List<Integer> results) {

            if (modifiedArray[counterPosition] == 0 && counterPosition > 0) {
                modifiedArray[counterPosition] = originalArray[counterPosition];
                counterPosition = counterPosition - 1;
            } else {
                modifiedArray[counterPosition] = modifiedArray[counterPosition] - 1;
                System.out.println(Arrays.toString(modifiedArray));
                generateFilePositions(originalArray, modifiedArray, counterPosition, results);
            }
        }
    }  

가변 길이 배열을 처리하려면 알고리즘이 재귀 적이어야 함을 이해하지만 생각하는 데 어려움이 있습니다. 그래서 저는 다른 접근법을 시도하기로 결정했습니다.

알고리즘 생성을위한 두 번째 시도는 현재 카운트 다운 위치 [가장 오른쪽 위치]에 포인터를 유지하는 이중 포인터 방법과 가장 오른쪽 위치가 0에 도달하면 감소 할 다음 가장 오른쪽이 아닌 위치 (pivotPointer)에 대한 포인터를 사용합니다. . 이렇게 :

import java.util.Arrays;

class DualPointer {
    public static void main(String[] args) {
        int[] counters = {2, 2, 2}; // initialize the problem set
        int[] original = {2, 2, 2}; // clone a copy to reset the problem array
        int[] stopConditionArray = {0, 0, 0};   // initialize an object to show what the stopCondition should be
        int pivotLocation = counters.length - 1;    // pointer that starts at the right, and moves left
        int counterLocation = counters.length - 1;  // pointer that always points to the rightmost position
        boolean stopCondition = false;

        System.out.println(Arrays.toString(counters));
        while (stopCondition == false) {

            if (pivotLocation >= 0 && counterLocation >= 0 && counters[counterLocation] > 0) {
                // decrement the rightmost position
                counters[counterLocation] = counters[counterLocation] - 1;
                System.out.println(Arrays.toString(counters));
            } else if (pivotLocation >= 0 && counters[counterLocation] <= 0) {
                // the rightmost position has reached zero, so check the pivotPointer
                // and decrement if necessary, or move pointer to the left
                if (counters[pivotLocation] == 0) {
                    counters[pivotLocation] = original[pivotLocation];
                    pivotLocation--;
                }
                counters[pivotLocation] = counters[pivotLocation] - 1;
                counters[counterLocation] = original[counterLocation]; // reset the rightmost position
                System.out.println(Arrays.toString(counters));
            } else if (Arrays.equals(counters, stopConditionArray)) {
                // check if we have reached the solution
                stopCondition = true;
            } else {
                // emergency breakout of infinite loop
                stopCondition = true;
            }

        }
    }
}

실행하면 두 가지 명백한 문제를 볼 수 있습니다.

[2, 2, 2]  
[2, 2, 1]  
[2, 2, 0]  
[2, 1, 2]  
[2, 1, 1]  
[2, 1, 0]  
[2, 0, 2]  
[2, 0, 1]  
[2, 0, 0]  
[1, 2, 2]  
[1, 2, 1]  
[1, 2, 0]  
[0, 2, 2]  
[0, 2, 1]  
[0, 2, 0]  

첫째, pivotPointer와 currentCountdown이 둘 이상의 배열 셀 떨어져있을 때 pivotPointer가 제대로 감소하지 않습니다. 두 번째로 라인에 arrayIndexOutOfBounds가있어 counters[pivotLocation] = counters[pivotLocation] - 1;고정되면 알고리즘이 모두 제대로 실행되지 않습니다.

어떤 도움을 주시면 감사하겠습니다.

있었다

다른 접근 방식을 제안하겠습니다.

재귀의 아이디어는 다른 재귀 호출을 할 필요가없는 사소한 경우에 도달 할 때까지 각 재귀 호출에서 문제의 크기를 줄이는 것입니다.

n 요소의 배열에 대해 재귀 메서드를 처음 호출 할 때 마지막 인덱스 (n-1)의 값 범위에 대해 루프를 반복하고 첫 번째 배열에 대한 모든 조합을 생성하는 재귀 호출을 수행 할 수 있습니다. n-1 요소, 출력을 결합합니다.

다음은 일부 Java / 부분 의사 코드입니다.

첫 번째 호출 :

List<int[]> output = generateCombinations(inputArray,inputArray.length);

재귀 적 방법 List<int[]> generateCombinations(int[] array, int length):

List<int[]> output = new ArrayList<int[]>();
if length == 0 
    // the end of the recursion
    for (int i = array[length]; i>=0; i--)
        output.add (i)
else
    // the recursive step
    List<int[]> partialOutput = generateCombinations(array, length - 1)
    for (int i = array[length]; i>=0; i--)
        for (int[] arr : partialOutput)
            output.add(arr + i)
return output

재귀 메서드는 List<int[]>. 즉, "output.add (i)"에서 단일 요소가있는 int 배열을 만들어 목록에 추가해야합니다. 반면에 output.add(arr + i)arr.length + 1 요소의 배열을 만들고 여기에 복사해야합니다. arr의 요소 다음에 i.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

새로운 매개 변수 Android로 카운트 다운 타이머 재설정

분류에서Dev

음수 카운트 다운을 계속하는 대신 새로 고침 타이머가 0에 도달하면 텍스트를 표시하도록합니다.

분류에서Dev

카운트 다운을 완료하는 데 남은 시간이 30 분 밖에 남지 않은 상태에서 카운트 다운 타이머의 배경 또는 텍스트 색상을 녹색으로 변경하는 방법은 무엇입니까?

분류에서Dev

JavaScript 카운트 다운을 jQuery 카운트 다운으로 변환하고 간격 추가

분류에서Dev

오늘 날짜를 가져 와서 카운트 다운으로 설정

분류에서Dev

클릭 할 때 카운트 다운을 1로 줄여서 카운트 다운이 0에 도달하면 창을 엽니 다.

분류에서Dev

0에 도달하면 카운트 다운 타이머에 "0"을 추가합니다.

분류에서Dev

0에서 중지 및 재설정되는 카운트 다운 타이머

분류에서Dev

kivy / python에서 화면을 변경하는 카운트 다운 / 타이머

분류에서Dev

카운트 다운이 끝난 후 카운트 다운 타이머가 자동으로 새로 고쳐지는 것을 중지하는 방법

분류에서Dev

카운트 다운 타이머의 좋은 대안-한 자릿수 앞에 "0"배치

분류에서Dev

웹 클라이언트가 특정 URL에서 문자열을 다운로드 할 수 없습니다.

분류에서Dev

grep에서 카운트 범위 변수 Bash OpenWRT 로의 라인 카운트

분류에서Dev

C에서 밀리 초 카운트 다운을 수행하는 가장 쉬운 방법은 무엇입니까?

분류에서Dev

카운트가있는 넓은 데이터 프레임을 R에서 긴 형식으로 변환

분류에서Dev

AS3 타이머-한 자리 카운트 다운에 0 추가, 글꼴 색상 변경

분류에서Dev

길이 배열이 주어지면 전체 길이에 가장 가까운 조합을 찾습니다.

분류에서Dev

카운트 다운 플립 클럭 및 0으로 카운트 후 재설정

분류에서Dev

가변 길이 배열을 정적 메모리에 효율적으로 저장

분류에서Dev

jQuery에서 카운트 다운 타이머 스타일 지정

분류에서Dev

0에서 IOS 중지 카운트 다운 타이머

분류에서Dev

카운트 다운 타이머에서 카운트 다운을 표시하려면 어떻게합니까

분류에서Dev

다른 HTML 프로젝트에서 JS 변수로 사용하기 위해 웹 사이트에서 데이터 카운터를 가져 오는 방법

분류에서Dev

bash에서 변수를 배열 길이로 설정하는 동안 오류가 발생했습니다.

분류에서Dev

Moment JS : 카운트 다운이 정확한 차이를 계산하지 않고 카운트 다운에 도달

분류에서Dev

PHP에서 카운트 다운으로 변경하고 싶습니다.

분류에서Dev

열에 같은 이름을 가진 다른 데이터를 1 카운트 SQL Server로 계산

분류에서Dev

ValueError : 요소가 두 개 이상있는 배열의 진리 값이 모호합니다. 4D 배열에서 1과 0 카운트를 찾는 방법

분류에서Dev

이 자바 스크립트 카운트 다운을 0에서 중지하고 싶습니다.

Related 관련 기사

  1. 1

    새로운 매개 변수 Android로 카운트 다운 타이머 재설정

  2. 2

    음수 카운트 다운을 계속하는 대신 새로 고침 타이머가 0에 도달하면 텍스트를 표시하도록합니다.

  3. 3

    카운트 다운을 완료하는 데 남은 시간이 30 분 밖에 남지 않은 상태에서 카운트 다운 타이머의 배경 또는 텍스트 색상을 녹색으로 변경하는 방법은 무엇입니까?

  4. 4

    JavaScript 카운트 다운을 jQuery 카운트 다운으로 변환하고 간격 추가

  5. 5

    오늘 날짜를 가져 와서 카운트 다운으로 설정

  6. 6

    클릭 할 때 카운트 다운을 1로 줄여서 카운트 다운이 0에 도달하면 창을 엽니 다.

  7. 7

    0에 도달하면 카운트 다운 타이머에 "0"을 추가합니다.

  8. 8

    0에서 중지 및 재설정되는 카운트 다운 타이머

  9. 9

    kivy / python에서 화면을 변경하는 카운트 다운 / 타이머

  10. 10

    카운트 다운이 끝난 후 카운트 다운 타이머가 자동으로 새로 고쳐지는 것을 중지하는 방법

  11. 11

    카운트 다운 타이머의 좋은 대안-한 자릿수 앞에 "0"배치

  12. 12

    웹 클라이언트가 특정 URL에서 문자열을 다운로드 할 수 없습니다.

  13. 13

    grep에서 카운트 범위 변수 Bash OpenWRT 로의 라인 카운트

  14. 14

    C에서 밀리 초 카운트 다운을 수행하는 가장 쉬운 방법은 무엇입니까?

  15. 15

    카운트가있는 넓은 데이터 프레임을 R에서 긴 형식으로 변환

  16. 16

    AS3 타이머-한 자리 카운트 다운에 0 추가, 글꼴 색상 변경

  17. 17

    길이 배열이 주어지면 전체 길이에 가장 가까운 조합을 찾습니다.

  18. 18

    카운트 다운 플립 클럭 및 0으로 카운트 후 재설정

  19. 19

    가변 길이 배열을 정적 메모리에 효율적으로 저장

  20. 20

    jQuery에서 카운트 다운 타이머 스타일 지정

  21. 21

    0에서 IOS 중지 카운트 다운 타이머

  22. 22

    카운트 다운 타이머에서 카운트 다운을 표시하려면 어떻게합니까

  23. 23

    다른 HTML 프로젝트에서 JS 변수로 사용하기 위해 웹 사이트에서 데이터 카운터를 가져 오는 방법

  24. 24

    bash에서 변수를 배열 길이로 설정하는 동안 오류가 발생했습니다.

  25. 25

    Moment JS : 카운트 다운이 정확한 차이를 계산하지 않고 카운트 다운에 도달

  26. 26

    PHP에서 카운트 다운으로 변경하고 싶습니다.

  27. 27

    열에 같은 이름을 가진 다른 데이터를 1 카운트 SQL Server로 계산

  28. 28

    ValueError : 요소가 두 개 이상있는 배열의 진리 값이 모호합니다. 4D 배열에서 1과 0 카운트를 찾는 방법

  29. 29

    이 자바 스크립트 카운트 다운을 0에서 중지하고 싶습니다.

뜨겁다태그

보관