【问题标题】:how can I sorting a number without using array?如何在不使用数组的情况下对数字进行排序?
【发布时间】:2019-04-03 22:20:18
【问题描述】:

如何在不使用任何数组的情况下找到可以使用给定数字(例如485735)的数字形成的最大和最小数字?

我正在研究冒泡排序算法(使用数组),我试图弄清楚如何在没有数组的情况下编写算法,但我的问题是计算每个数字的索引

我唯一想到的是一种算法来计算输入中的位数(朋友帮我解决了这个问题),但到目前为止,我已经尝试了 4 天来解决这个问题 这是一个我的作业成绩的问题

规则是最小的数不能从零开始 例如:

Input: 3134059 
The largest number is: 9543310
The smallest number is: 1033459

【问题讨论】:

  • 因为我们还没有在课程中学习数组,所以我们不允许使用它
  • @shmosel 如果值中有 2 个或多个零,那将不起作用。 --- 另外,我认为使用Stream::sorted(),在内部构建一个列表并对其进行排序,违反了“无数组”限制的精神,所以我会标记它失败,如果我是老师评分回答。
  • @Andreas 是的,不幸的是我认为你是对的
  • @Andreas 那么字符串是完全非法的吗?

标签: java algorithm bubble-sort


【解决方案1】:

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 了解如何做到这一点。

【讨论】:

    【解决方案2】:
    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) &lt; (s.charAt(j))) 的符号并删除 while 语句。

    【讨论】:

    • 由于StringBuilder 内部使用char[],我会说这违反了“无数组”限制的精神,所以如果我是老师,我会将其标记为失败给这个答案评分。
    猜你喜欢
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 2012-03-24
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    相关资源
    最近更新 更多