劍指 Offer 45 把陣列排成最小的數

2021-10-24 06:55:27 字數 1561 閱讀 8698

題目描述:

輸入乙個非負整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。

示例1:

輸入: [10,2]

輸出: 「102」

示例2:

輸入: [3,30,34,5,9]

輸出: 「3033459」

解題思路:

這道題主要是要得出乙個排序規則,陣列根據這個規則排序之後進行拼接可以得到乙個最小的數字。根據題目的要求,兩個數字mn能拼接成數字mnnm。如果mn < nm,那麼m應該排在n的前面(即m「小於」n)。mnnm的大小可以使用string.compare(string)進行比較,因為mnnm的長度是一樣的,而compareto方法在對比相同長度的字串的大小時是逐個比較字串中的字元的ascii碼的大小關係。因此,確定好數字之間的「大小關係」之後就可以對陣列進行排序了,最後將排序好的陣列拼接成乙個字串就是所有數字中的最小的乙個。

排序的方法有三種實現方式,分別是快速排序法、使用現有的arrays.sort()和小根堆priorityqueue進行排序(後兩種方式注意重寫comparator介面中的compare方法)

時間複雜度和空間複雜度:時間複雜度為o(nlogn),空間複雜度為o(n)

實現**:

//解法1:使用快排對字串進行排序

public string minnumber

(int

nums)

public

void

quicksort

(string[

] str,

int low,

int high)

public

void

swap

(string[

] str,

int i,

int j)

//解法2:使用arrays.sort()

public string minnumber1

(int

nums)

//解法3:使用小根堆

public string minnumber2

(int

nums)

劍指offer 45 把陣列排成最小的數

輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。思路1 根據全排列,將三個數字的全排列全寫出來,然後比較大小,這種辦法在數比較多時,效率不高。思路2 先比較前兩個數字m和n排列的大小 mn和n...

劍指Offer 45 把陣列排成最小的數

輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例 輸入陣列,列印321323。排列出所有的組合,比較出最小的,輸出。時間複雜度 o n 空間複雜度 o n 考察最小組合的形式,遵從下面的規律 1 首位小的靠前 2 首位相同,次位小的靠前 3 位數少的靠前...

把陣列排成最小的數(劍指offer 45)

輸入乙個正整數陣列,把陣列裡所有的數拼接為乙個數,列印出能拼接出的所有數字中最小的乙個。比如輸入 輸出 321323.這道題其實是希望我們能找到乙個排序規則,陣列根據這個排序規則排列後能排成乙個最小的數。要確定排序規則,就要比較兩個數字,也就是給出兩個數字m n,我們需要確定乙個規則判斷m和n哪個應...