如何找到不使用任何数组就可以使用给定数字的数字(例如485735
)形成的最大和最小数字?
我当时正在研究冒泡排序(使用数组)算法,试图弄清楚如何在不使用数组的情况下编写算法,但是我的问题是要计算每个数字的索引
我唯一想到的是一种计算输入数字位数的算法(朋友帮助我完成了这项工作),但到目前为止,我已经尝试了4天 这是我的作业成绩的一个问题
规则是最小的数字不能以零开头 例如:
Input: 3134059
The largest number is: 9543310
The smallest number is: 1033459
答案 0 :(得分:2)
TL; DR:请参见IDEONE的以下逻辑演示。
假设数字是一个数字数组,例如名为d[]
,并假设索引0
是最右边的数字。
冒泡排序会将较高的值移到较高的索引,因此,如果我们保持这种逻辑,则对d
进行排序将得到所需的largestNumber
,例如1357924
成为9754321
。
假设您有一种方法pow10(n)
计算出10 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]
)以及如何“交换数组元素”,并将其写入普通的bubbleort算法中,这样您就可以:
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了解具体操作方法。
答案 1 :(得分:0)
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语句(if (s.charAt(i) < (s.charAt(j))
上的符号,并删除while语句。