我一直在練習算法,而遞歸總是我的弱點。此問題要求將嵌套數組平鋪爲單個數組。如果使用給定O(n^3)[給定相同大小的3d陣列]解決方案的循環,這將很簡單。Java-使用遞歸展平數組
然而隨着遞歸,我一直在掙扎幾個小時。這是我的,請注意我已經涉足了我的代碼嘗試不同的解決方案,這正是我決定留下來發布給你們。
我想什麼是兩件事情,反正是有解決我當前的代碼,以獲得正確的輸出,並且是有使用遞歸,感謝寫這個代碼更簡單,更混亂的方式!
獎金問題,如果我不知道嵌套陣列的尺寸,我將如何去了解這個問題,然後使用遞歸?
編輯 好了,所以經過一番硬編碼(我不想做),我設法得到這個工作。但是,代碼現在是硬編碼,非常混亂,有無論如何清理代碼或採用遞歸解決這個問題的簡單方法嗎?
EDIT2 我試圖重做-ING使用helper方法遞歸這個問題。我去看看,如果我使用這種風格有更好的運氣
import java.io. * ;
import java.util. * ;
class Solution {
// static int oneLen = 0;
//static int twoLen = 0;
//static int threeLen = 0;
static int oneCnt = 0;
static int twoCnt = 0;
static int threeCnt = 0;
static ArrayList <Integer> result = new ArrayList <Integer>();
public static ArrayList <Integer> flatten(int [][][] arr){
if (oneCnt < arr[threeCnt][twoCnt].length && !(oneCnt == 2 && twoCnt == 2 && threeCnt == 2))
{
if (oneCnt == 0 && twoCnt == 0 && threeCnt == 0){
result.add(arr[threeCnt][twoCnt][oneCnt]);
oneCnt++;
result.add(arr[threeCnt][twoCnt][oneCnt]);
System.out.println("Line One");
System.out.println("Count1: " + oneCnt);
System.out.println("Count2: " + twoCnt);
System.out.println("Count3: " + threeCnt);
}
oneCnt++;
if (oneCnt != 3){
result.add(arr[threeCnt][twoCnt][oneCnt]); }
System.out.println("Line One");
System.out.println("Count1: " + oneCnt);
System.out.println("Count2: " + twoCnt);
System.out.println("Count3: " + threeCnt);
flatten(arr);
} else if (oneCnt == arr[threeCnt][twoCnt].length && twoCnt < arr[threeCnt].length - 1){
//oneLen = 0;
oneCnt = 0;
// twoLen++;
twoCnt++;
result.add(arr[threeCnt][twoCnt][oneCnt]);
System.out.println("Line Two");
System.out.println("Count:1 " + oneCnt);
System.out.println("Count:2 " + twoCnt);
System.out.println("Count:3 " + threeCnt);
flatten(arr);
}
else if (oneCnt == arr[threeCnt][twoCnt].length && twoCnt == arr[threeCnt].length - 1 && threeCnt < arr.length - 1){
oneCnt = 0;
twoCnt = 0;
threeCnt++;
result.add(arr[threeCnt][twoCnt][oneCnt]);
System.out.println("Line Three");
System.out.println("Count:1 " + oneCnt);
System.out.println("Count:2 " + twoCnt);
System.out.println("Count:3 " + threeCnt);
flatten(arr);
}
return result;
}
public static void main(String[] args) {
int[][][] array =
{ { {1, 2, 3}, { 4, 5, 6}, { 7, 8, 9} },
{ {10, 11, 12}, {13, 14, 15}, {16, 17, 18} },
{ {19, 20, 21}, {22, 23, 24}, {25, 26, 27} } };
flatten(array);
for (int i = 0; i < result.size(); i++){
System.out.print(result.get(i) + ",");
}
}
}
輸出:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ,16,17,18,19,20,21,22,23,24,25,26,27,
EDIT3 使用的輔助遞歸我幾乎有答案,但最後一個元素後不會添加到數組列表。
import java.io. * ;
import java.util. * ;
class Solution {
static ArrayList <Integer> result = new ArrayList <Integer>();
public static void flatten(int [][][] arr){
int oneLen = 0;
int twoLen = 0;
int threeLen = 0;
flattenHelper(arr, oneLen, twoLen, threeLen);
}
public static void flattenHelper(int [][][] arr, int oneLen, int twoLen, int threeLen){
if (oneLen < arr[threeLen][twoLen].length - 1){
System.out.println("Line One");
System.out.println("Count:1 " + oneLen);
System.out.println("Count:2 " + twoLen);
System.out.println("Count:3 " + threeLen);
result.add(arr[threeLen][twoLen][oneLen]);
flattenHelper(arr, oneLen + 1, twoLen, threeLen);
}
else if (twoLen < arr[threeLen].length - 1){
System.out.println("Line Two");
System.out.println("Count:1 " + oneLen);
System.out.println("Count:2 " + twoLen);
System.out.println("Count:3 " + threeLen);
result.add(arr[threeLen][twoLen][oneLen]);
flattenHelper(arr, oneLen = 0, twoLen + 1, threeLen);
} else if (threeLen < arr.length - 1){
System.out.println("Line Two");
System.out.println("Count:1 " + oneLen);
System.out.println("Count:2 " + twoLen);
System.out.println("Count:3 " + threeLen);
result.add(arr[threeLen][twoLen][oneLen]);
flattenHelper(arr, oneLen = 0, twoLen = 0, threeLen + 1);
}
}
public static void main(String[] args) {
int[][][] array =
{ { {1, 2, 3}, { 4, 5, 6}, { 7, 8, 9} },
{ {10, 11, 12}, {13, 14, 15}, {16, 17, 18} },
{ {19, 20, 21}, {22, 23, 24}, {25, 26, 27} } };
flatten(array);
for (int i = 0; i < result.size(); i++){
System.out.print(result.get(i) + ",");
}
}
}
輸出:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 ,22,23,24,25,26,
謝謝!這正是我在回答我的獎金時所要找的。 – user3051442
我可以問問反映庫的作用以及它如何與此解決方案相關?試圖找到一些文件,謝謝。 – user3051442
這是一個很好的開始: https://docs.oracle.com/javase/tutorial/reflect/ 它基本上使Java稍微「僵化」一些,並且帶來了一些在Python等語言中更常見的方法和Ruby。 有時,在編譯時你無法知道所有的東西,需要等待運行時。像:我知道這個對象看起來像一個數組,它可能是int [] [],或者它可能是ArrayList,我只是想遍歷所有的元素。 –