<font size="5px" color="#87CEFA" >描述</font>
? ?????在同學們的幫助下,阮小二是變的越來越懶了,連算賬都不愿意自己親自動手了,每天的工作就是坐在電腦前看自己的銀行賬戶的錢是否有變多??墒且欢螘r間觀察下來,阮小二發(fā)現(xiàn)自己賬戶的錢增長好慢啊,碰到節(jié)假日的時候連個銅板都沒進,更郁悶的是這些天分文不進就算了,可恨的是銀行這幾天還有可能“落井下石”(代扣個人所得稅),看著自己賬戶的錢被負增長了,阮小二就有被割肉的感覺(太痛苦了!),這時阮小二最大的愿望無疑是以最快的速度日進斗金,可什么方法能夠日進斗金呢?搶銀行(老本行)?不行,太危險,怕有命搶沒命花;維持現(xiàn)狀?受不了,摟錢太慢了!想來想去,抓破腦袋之后,終于想到了能快速發(fā)家致富的法寶----買彩票,不但掙了錢有命花,運氣好的話,可以每天中他個幾百萬的,豈不爽哉!抱著這種想法,阮小二開始了他的買彩票之旅。想法是“好的”(太天真了OR 太蠢了),可是又發(fā)現(xiàn)自己的數(shù)學功底太差,因為不知道數(shù)字都有哪些組合排列?那現(xiàn)在就請同學們寫個遞歸程序,幫助阮小二解決一下這個問題吧!
****<font size="5px" color="#87CEFA" >輸入</font>****
輸入描述:
不超過6位數(shù)的正整數(shù)N,注意:構成正整數(shù)N的數(shù)字可重復
輸入樣例:
123
****<font size="5px" color="#87CEFA" >輸出</font>****
輸出描述:
組成正整數(shù)N的所有位數(shù)的全排列,這些排列按升序輸出,每個排列占一行。
注意:輸出數(shù)據(jù)中不能有重復的排列
輸出樣例:
123
132
213
231
312
321
****<font size="5px" color="#87CEFA" >思路分析</font>****
? ?????首先是將輸入的數(shù)字轉換成字符串,然后將輸入的數(shù)字進行從小到大排序,便于之后的輸出。
??????之后調用Count方法進行遞歸。Count方法擁有一個for循環(huán)遍歷,用來枚舉所有數(shù)。因為題目要求一個數(shù)字只能用一次。故Count遞歸調用有三個參數(shù)。第一個參數(shù)是去掉該for循環(huán)中使用的參數(shù),通過str.substring(0, i) + str.substring(i + 1)取出新的字符串。第二個參數(shù)k-1則是字符串中還有多少個字符。第三個參數(shù)str2 + str.charAt(i)表示將取出的第i個字符存到str2中。遞歸的出口是當字符個數(shù)為0時,將str2存入到g數(shù)組中。
??????遞歸完成后重新回到main方法,通過List<String> 取出g數(shù)組中的重復元素。最后輸出結果
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;;
public class lanqiao1314 {
static String[] g;
static int num = 0;
public static void main(String[] args) {
Scanner reader = new Scanner(System.in); //Scanner輸入
String str = reader.nextLine();
char[] r = str.toCharArray(); //將輸入的數(shù)轉換成數(shù)組
int s = 1;
for (int i = 1; i <= r.length; i++) {
s *= i; //階乘計算數(shù)組所需的大小
}
g = new String[s];
Arrays.sort(r); //對輸入的數(shù)字進行排序
Count(new String(r), str.length() - 1, ""); //調用Count方法,運用遞歸
List<String> list = new ArrayList<String>(); //這一個代碼段表示運用List去除數(shù)組中重復的數(shù)值,
for (String b : g) {
if (!list.contains(b))
list.add(b);
}
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
reader.close();
}
static void Count(String str, int k, String str2) {
if (k == -1) { //如果k==-1,則將排列好的數(shù),存入數(shù)組g中,并返回
g[num++] = str2;
return;
}
for (int i = 0; i < str.length(); i++) {
Count(str.substring(0, i) + str.substring(i + 1), k - 1, str2 + str.charAt(i)); //遞歸調用Count方法,枚舉所有可能的數(shù)
}
}
}
****這是我的第一篇博客,如果有寫得不好的地方,希望大家指教。謝謝!****