簡體   English   中英

使用遞歸以相反順序打印 char 數組的方法?

[英]Method to print a char array in reverse order using recursion?

您好,我正在嘗試創建一種使用遞歸以相反順序打印 char 數組的方法?

這是我到目前為止所做的:-

public class StringReverseOnCharArray {

    public static void main(String[] args) {
        reverseRecursively(new char[]{'a','b','c'});
    }

    private static void reverseRecursively(char[] myCharArr)
    {
        System.out.println(myCharArr[myCharArr.length-1]);
        char [] temp=
                // what next??

        reverseRecursively(temp);
    }

}

我認為臨時 char 數組可以,但我應該怎么做才能從原始 char 數組中刪除最后一個元素並創建一個臨時數組? 還是有其他方法可以做到這一點?

您可能可以使用System.arraycopy

這是一個解決方案。

private static void reverseRecursively(char[] myCharArr, int next) {
    if (next >= myCharArr.length)
        return;

    // use recusion BEFORE printing in order to print in reversed order
    reverseRecursively(myCharArr, next+1); 
    System.out.println(myCharArr[next]);
}

對該方法的第一次調用應使用 0 作為“下一個”索引:

    reverseRecursively(myCharArr, 0);

正如所指出的,這通常不是遞歸完成的。 所以這個解決方案不好,但它有效:

public class StringReverseOnCharArray {

    public static void main(String[] args) {
        reverseRecursively(new char[] { 'a', 'b', 'c' });
    }

    private static void reverseRecursively(char[] myCharArr) {
        if (myCharArr.length > 0) {
            System.out.println(myCharArr[myCharArr.length - 1]);
            char[] temp = new char[myCharArr.length - 1];
            for (int i = 0; i < temp.length; i++) {
                temp[i] = myCharArr[i];
            }

            reverseRecursively(temp);
        }
    }
}

更新的答案

我想我誤解了。 如果您必須使用聲明的函數並只填寫temp位,並且您只需要以相反的順序輸出數組(實際上並不更改其內容),那么這很簡單:只需將temp復制一份length - 1字符數組(可能使用System.arraycopy )並將新的、較短的數組傳遞給函數。 如果您收到的數組只有一個字符長,請不要這樣做; 這就是你的遞歸終止條件(你總是必須有一些東西來停止遞歸,它應該是你在考慮遞歸做某事時首先考慮的事情之一)。


原答案

在我看來,告訴你對問題使用錯誤技術的作業並不是一個非常有用的作業。 有各種適合的遞歸教學練習; 這不是其中之一。

但是讓我們看看任務:

遞歸的目標基本上是在問題的不同部分重復做某事,直到您完成整個問題。 更好的例子是遍歷樹結構。

所以看看這個問題,你的目標是交換數組中的字符,直到數組被反轉。 這里重復的東西是什么? 交換字符。

所以我可能會通過將索引傳遞給函數來完成它,並讓函數將該索引處的字符與length - index位置處的字符交換(例如,交換第一個和最后一個,然后是第二個和第二個- 到最后等)。 然后讓它用index + 1調用自己。

所有遞歸基本上都必須有一個“停止”條件:函數不再調用自身的點。 在您的情況下,這將是index >= length_of_array / 2

請注意,我還沒有發布代碼。 編寫代碼的目的是完成作業、完成課程; 這是學習的重要組成部分。

時間復雜度為 O(n),空間復雜度為 O(1)

def revStr(a,b,str):
  if(a-b>len(str)):
    return str

  else:
    str[a],str[b]=str[b],str[a] #Pythons way of replacing characters
    return revStr(a+1,b-1,str)

此解決方案不采用新參數,也無需創建新的 Char 數組。

class Solution {
int n=0;
public void reverseString(char[] c) {
    if (n>(c.length-1)/2) 
        return;
    
        char t = c[n];
        c[n] = c[c.length-n-1];
        c[c.length-n-1] = t;
        n++;
        reverseString(c);
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM