2 回答
TA贡献1943条经验 获得超7个赞
参考资料:请参阅以下逻辑演示。
假装数字是一个数字数组,例如命名,并假装索引是最右边的数字。d[]0
气泡排序会将更高的值移动到更高的索引,因此,如果我们保持该逻辑,则排序将产生所需的 ,例如 成为。dlargestNumber13579249754321
假设你有一个计算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在不使用数组的情况下反转int值,了解如何执行此操作。
TA贡献1936条经验 获得超6个赞
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
}
这是针对最小的数字,对于最大的数字,请更改 if 语句 ( ) 上的符号并删除 while 语句。if (s.charAt(i) < (s.charAt(j))
添加回答
举报