藍橋杯算法提高-阮小二買彩票問題(Java語言)

<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ù)
        }
    }
}

****這是我的第一篇博客,如果有寫得不好的地方,希望大家指教。謝謝!****

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容