TL;DR:请参阅IDEONE 的以下逻辑演示。
假设数字是一个数字数组,例如命名为d[],并假设索引0 是最右边的数字。
冒泡排序会将更高的值移动到更高的索引,因此如果我们保持这种逻辑,对d 进行排序将产生所需的largestNumber,例如1357924 变为 9754321。
假设您有一个计算 10n 的方法 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
在冒泡排序中,如果较低索引的元素较大,则交换相邻元素,因此首先我们需要这两个值。假设我们正在为i = 3 做这件事:
6 4 2 0 index
↓ ↓ ↓ ↓
number = 1357924
i = 3
a = d[i] = d[3] = 7
b = d[i+1] = d[4] = 5
由于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)
可以重构为:
number += ((a - b) * 10 - (a - b)) * pow10(i)
既然您知道如何获取“数组元素值”,即d[i],以及如何使用上述公式“交换数组元素”,您可以将其写入普通冒泡排序算法,这样您就可以:
largestNumber = sortDigits(number)
您现在已经计算出最大值。要计算最小值,您需要简单地反转数字,但在此之前,您需要确保 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
现在你可以计算你需要的其他值了:
smallestNumber = reverse(n)
参见例如Java reverse an int value without using array 了解如何做到这一点。