2 回答

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
參考資料:請(qǐng)參閱以下邏輯演示。
假裝數(shù)字是一個(gè)數(shù)字?jǐn)?shù)組,例如命名,并假裝索引是最右邊的數(shù)字。d[]0
氣泡排序會(huì)將更高的值移動(dòng)到更高的索引,因此,如果我們保持該邏輯,則排序?qū)a(chǎn)生所需的 ,例如 成為。dlargestNumber13579249754321
假設(shè)你有一個(gè)計(jì)算10n的方法,然后你可以在任何索引處得到數(shù)字:pow10(n)
d[i] = number / pow10(i) % 10
例:
6 4 2 0 index
↓ ↓ ↓ ↓
number = 1357924
d[4] = 1357924 / pow10(4) % 10
= 1357924 / 10000 % 10
= 135 % 10
= 5
在氣泡排序中,如果索引較低的元素較大,則可以交換相鄰的元素,因此首先需要兩個(gè)值。假設(shè)我們這樣做是為了:i = 3
6 4 2 0 index
↓ ↓ ↓ ↓
number = 1357924
i = 3
a = d[i] = d[3] = 7
b = d[i+1] = d[4] = 5
因?yàn)槲覀冃枰粨Q值。我們可以按如下方式執(zhí)行此操作:a > b
1357924
- 7000 Clear digit at i=3
- 50000 Clear digit at i=4
=1300924 Value with digits cleared
+ 70000 Set digit at i=4
+ 5000 Set digit at i=3
=1375924 Value with digits at index 3 and 4 swapped
公式為:
number = number - a * pow10(i) - b * pow10(i+1)
+ a * pow10(i+1) + b * pow10(i)
可以重構(gòu)為:
number += ((a - b) * 10 - (a - b)) * pow10(i)
現(xiàn)在您已經(jīng)知道如何獲取“數(shù)組元素值”(又名 ),以及如何使用上述公式“交換數(shù)組元素”,然后將其寫(xiě)入正常的氣泡排序算法中,以便您可以:d[i]
largestNumber = sortDigits(number)
現(xiàn)在,您已經(jīng)計(jì)算出最大值。要計(jì)算最小值,您只需反轉(zhuǎn)數(shù)字,但在執(zhí)行此操作之前,您需要確保:d[0] != 0
n = largestNumber, i = 0
while (n % 10 == 0) { // locate least non-zero digit
n /= 10
i++
}
if (i != 0) {
// clear least digit and add at index 0
n = n / 10 * pow10(i + 1) + n % 10
}
例:
n = 97500
After loop: n = 975, i = 2
n / 10 = 97
* pow10(i + 1) = 97000
+ n % 10 = 97005
現(xiàn)在,您可以計(jì)算所需的其他值:
smallestNumber = reverse(n)
例如,請(qǐng)參閱Java在不使用數(shù)組的情況下反轉(zhuǎn)int值,了解如何執(zhí)行此操作。

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
public static void main(String[] args) {
StringBuilder s = new StringBuilder("4857035");
char aux;
for (int i = 0; i < s.length() - 1; i++) {
for (int j = i + 1; j < s.length(); j++) {
if (s.charAt(i) > (s.charAt(j))) {
aux = s.charAt(i);
s.setCharAt(i, s.charAt(j));
s.setCharAt(j, aux);
}
}
}
//output 0345578
while (s.charAt(0) == '0') {
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) != '0') {
aux = s.charAt(0);
s.setCharAt(0, s.charAt(i));
s.setCharAt(i, aux);
break;
}
}
}
//output 3045578
}
這是針對(duì)最小的數(shù)字,對(duì)于最大的數(shù)字,請(qǐng)更改 if 語(yǔ)句 ( ) 上的符號(hào)并刪除 while 語(yǔ)句。if (s.charAt(i) < (s.charAt(j))
添加回答
舉報(bào)