在一行中輸出能夠組成的最小的數

kua_fuXz發表於2020-12-08

仔細讀題,審題很重要 ,真的很重要。

下面分享一道題:

給定數字0-9各若干個。你可以以任意順序排列這些數字,但必須全部使用。 目標是使得最後得到的數儘可能小(注意0不能做首位)。

例如:給定兩個0,兩個1,三個5,一個8,我們得到的最小的數就是10015558。現給定數字,請編寫程式輸出能夠組成的最小的數。

輸入描述:

每個輸入包含1個測試用例。每個測試用例在一行中給出10個非負整數, 順序表示我們擁有數字0、數字1、……數字9的個數。整數間用一個空 格分隔。10個數字的總個數不超過50,且至少擁有1個非0的數字。

輸出描述:

在一行中輸出能夠組成的最小的數。

輸入:

2200030010(即兩個0,兩個1,三個5,一個8,我們得到的最小的數就是10015558)

輸出:

10015558

思路 :找到所給數字中非零並且最小的數,讓它為數字最高位,然後將剩餘元素從小到大依次新增

程式碼如下:


public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            //用陣列存,陣列內元素值代表數字0-9的個數
            int[] nums = new int[10];
            for(int i = 0;i<10;i++){
                nums[i] = in.nextInt();
            }
            System.out.println(GetNum(nums));
        }
    }
        public static String GetNum( int[] nums) {
            //找到所給數字中非零並且最小的數,讓它為數字最高位
            //因為是順序表示我們擁有數字0、數字1、……數字9的個數,所以陣列中下標1代表的就是數字1的個數,
            // 從1開始找,找到直接break並且陣列i下標減一
            String s = "";
            for(int i = 1; i<10;i++){
                if(nums[i] != 0){
                    s += i;
                    nums[i] --;
                    break;
                }
            }
            //找到最小值放在最高位後,然後將剩餘元素從小到大依次新增,外層迴圈代表數字0-9,內層迴圈數字0-9分別的個數
            for(int i = 0;i<10;i++){
                while(nums[i] != 0){
                    s += i;
                    nums[i] --;
                }
            }
            return s;
        }
}

這道題本身並不難,但是開始未認真讀題,沒有看到順序表示,認為輸入為2200030010,則輸出最小的應該為100000223,開始還考慮用排序,棧,佇列等資料結構來解決,所以,再次強調各位以及自己!!!!仔細讀題審題很重要

相關文章