簡體   English   中英

Java遞歸電話號碼字母

[英]Java recursion phone number letters

您如何使用遞歸方法編寫 java 程序,該方法接受一個像“234”這樣的整數,並將其轉換為手機鍵盤上的相應字母(2 = ABC,3 = DEF 等),並打印出這個的排列? 例如:

輸入 = 234

輸出 = ADG ADH ADI AEG AEH AEI AFG AFH AFI BDG BDH BDI BEG BEH BEI BFG BFH BFI CDG CDH CDI CEG CEH CEI CFG CFH CFI


輸入 = 89

輸出 = TW TX TY TZ UW UX UY UZ VW VX VY VZ

單獨生成排列將構成一個很好的家庭作業,更不用說強制遞歸和電話號碼分心了。

通過類似於排序網絡的方法,可以有效地生成少量排列。 n 個元素的序列有n! 排列(假設一個完整的 draw ,每個排列也由n 個元素組成)。 觀察到,對於二元素序列,有兩種排列:

  • 原始序列,和
  • 兩個元素交換。

對於三元素序列,有六種排列:

  • 底部兩個元素的排列,然后
  • 將序列向右(或向左)旋轉一個單元格,以及
  • 底部兩個元素的排列,然后
  • 將序列向左(或向右,與上述相反)旋轉一個單元格,以及
  • 底部兩個元素的排列。

也就是說,它是執行 3 次的雙元素版本,中間有兩次轉換。 現在,一個四元素序列有 24 個排列:

  • 底部三個元素的排列,然后
  • 保存位置1,將0賦給1,將3賦給0,將保存的值賦給3,然后
  • 底部三個元素的排列,然后
  • 交換位置 0 和 2,交換位置 1 和 3(或向右旋轉 2),以及
  • 底部三個元素的排列,然后
  • 保存位置3,將2賦值給3,0賦值給2,保存的值賦值為0,然后
  • 底部三個元素的排列。

你開始看到一種模式了嗎? 注意到解決方案的遞歸性質了嗎?

以上四個元素,模式更難發現。 您可以向下迭代序列,將所選元素與最后一個元素交換,反轉序列,每次擴展底部 24 個排列。

試着把它寫在紙上,記錄你對元素進行洗牌的步驟,你會發現你已經編寫了你需要的程序。


另請注意,此處發布的大多數解決方案都使用String類型並不斷將其切碎並重新組裝。 String是一個糟糕的選擇,因為它是不可變的,當生成排列時,最好通過交換和旋轉向量(實際上是ring )中的元素來完成。

您實際上必須將信件寫出到目標流是很少見的情況,因此請使您的解決方案偏向於該操作。 使用字符數組並在需要發出特定排列時將字符一個一個地寫入流。 形成一個字符串只是為了將條目轉儲到流中涉及不必要的分配和復制。

  1. 獲取輸入,轉換為字符串

  2. 調用函數 generate(String prefix, String suffix) 前綴為空,轉換后的輸入為后綴

  3. 在 generate() 中,從后綴中刪除第一個數字,將其映射到相應字母的數組,並為數組中的每個字母遞歸調用 generate(),將其附加到前綴。

import java.util.ArrayList;

class PhoneNumbers
{
    public static void main(String[] args)
    {
        for (String result: convert(args[0]))
            System.out.println(result);
    }

    public static ArrayList<String> convert(String phoneNumber)
    {           
        int digit = Integer.parseInt(phoneNumber.substring(0, 1));
        String letters = new String[] {
            "0",
            "1",
            "ABC",
            "DEF",
            "GHI",
            "JKL",
            // etc...
        }[digit];

        ArrayList<String> result = new ArrayList<String>();

        for (int i = 0; i < letters.length(); ++i) {
            char letter = letters.charAt(i);
            if (phoneNumber.length() > 1) {
                for (String rest: convert(phoneNumber.substring(1)))
                    result.add(letter + rest);
            } else {
                result.add("" + letter);
            }
        }

        return result;
    }
}

java電話號碼234

ADG
ADH
ADI
AEG
AEH
AEI
AFG
AFH
AFI
...

這是一個沒有數組或數組列表的版本。 結果按照您的要求打印到標准輸出。

String[] allLetters = new String[] {
                "0",
                "1",
                "ABC",
                "DEF",
                "GHI",
                "JKL",
                // etc...
        };

public static void convert(String phoneNumber)
{
  convertSubstring(phoneNumber,"");
}

private static void convertSubstring(String phoneNumber, String convertedLetters)
{                   
  int digit = Integer.parseInt(phoneNumber.substring(0, 1));
  String letters=allLetters[digit];
  String remainingString=phoneNumber.substring(1);

  for (int i = 0; i < letters.length(); ++i) 
  {
     char letter = letters.charAt(i);
     String result=convertedLetters+letter;
     if (remainingString.length()==0)
        System.out.println(result);
     else
        convertSubstring(remainingString, result);
  }
}
public class printKeypad {
public static char[] keynotes(int n)
{
    String s[]= {"","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    String s1=s[n-1];
    char c[]=new char[s1.length()];
    for(int i=0;i<c.length;i++)
    {
        c[i]=s1.charAt(i);
    }
    return c;
}
public static void printKeypad(int n)
{
    printKeypad(n,"");
}
public static void printKeypad(int n,String output)
{
    if(n==0)
    {
        System.out.println(output);
        return;
    }
    char c[]=keynotes(n%10);
    for(int i=0;i<c.length;i++)
    {
        printKeypad(n/10,output+c[i]);
    }
}
public static void main(String[] args) {
    int n=23;
    printKeypad(n);
}

} //打印和鍵盤返回都使用不同的方法來解決

暫無
暫無

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

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