亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在不使用數組的情況下對數字進行排序?

如何在不使用數組的情況下對數字進行排序?

胡子哥哥 2022-09-21 21:37:25
我如何找到可以使用給定數字的數字(例如)形成的最大值和最小數,而根本不使用任何數組?485735我正在研究氣泡排序算法(使用數組),我試圖弄清楚如何在沒有數組的情況下編寫算法,但我的問題是計算每個數字的索引我唯一想到的是一個算法來計算輸入中的位數(朋友幫我解決了這個問題),但到目前為止,我試圖弄清楚這件事4天,這是一個與我的家庭作業成績有關的問題。規則是最小的數字不能以零開頭,例如:Input: 3134059 The largest number is: 9543310The smallest number is: 1033459
查看完整描述

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值,了解如何執行此操作。


查看完整回答
反對 回復 2022-09-21
?
LEATH

TA貢獻1936條經驗 獲得超7個贊

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))


查看完整回答
反對 回復 2022-09-21
  • 2 回答
  • 0 關注
  • 155 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號