簡體   English   中英

如何對 int 數組中的元素進行排序以創建可能的最大數字

[英]How to sort elements in an int array to create the largest number possible

我有一個練習來對數組進行排序(類型 int),這樣我就可以獲得盡可能多的數字。

一個例子:

1,3,9 ==> 931

1,3,9,60 ==> 96031

所以這是我的想法:不可能只對數組進行排序以形成我想要的數字。 所以我可以檢查數組中每個元素的第一個數字,使用與冒泡排序相同的想法,只是一個小的區別是我使用第一個元素來檢查而不是 arr[i]。 但是我仍然想知道除了使用我的想法之外,還有其他方法(更高效)。 即使您的想法與我的想法完全相同,但您有一些升級。 非常感謝

解決方案

對於降序,我們在這里將數組中的每個值乘以 -1,然后對數組進行排序,然后再乘以 -1。 最終我們用字符串連接構建結果字符串並打印出來

import java.util.Arrays;

public class MyClass {
    public static void main(String args[]) {
    int[] array = {3,1,9};
    
    for (int l = 0; l < array.length; l++){
        array[l] = array[l]*-1;
    }
    Arrays.sort(array);
    for (int l = 0; l < array.length; l++){
        array[l] = array[l]*-1;
    }
    String res = "";
    
    for(int i = 0; i < array.length; i++){
        res+=array[i];
        
    }
    System.out.println(res);
    }
}

Output

931

或者

或者正如@Matt 在評論中提到的那樣,您基本上可以以相反的順序連接字符串。 然后不再需要使用*-1進行升序到降序的轉換

 import java.util.Arrays;

 public class MyClass {
     public static void main(String args[]) {
         int[] array = {
             9,
             1,
             3
         };
         String res = "";

         Arrays.sort(array);
         for (int l = array.length - 1; l >= 0; l--) {
             res += array[l];
         }



         System.out.println(res);
     }
 }

不可能只對數組進行排序以形成我想要的數字。

其實,也不是不可能。

您需要設計和實現一個排序,該排序將產生(十進制)數字,這將使最終數字最大,以便首先排序; 例如,對於您問題中的數字,順序為:

9 < 60 < 3 < 1

您只需要准確計算出所有可能的非負整數所需的排序。 完成后,編寫一個實現排序的Comparator器 class。

提示:您可以使用遞歸指定排序...

比較每個 int 的第一個數字,然后如果它是最大的,則將其放在開頭,然后繼續,如果第一個字符相等,則進入第二個等,以此類推,如果在 max-char-size 處相同,則為最大的勝利。 如您所知,第一個被選中的將被推送,然后第二個被立即推送。

在那種方式 9 > 60 cuz 960>609 中,當你連接時,第一個字符將始終是最大的。

它是 > 9 < 不是 > 09 <

希望它會按照您的要求工作->

 public static void main(String[] args) {
            Integer[] arr = {1,3,3,9,60 };
            List<Integer> flat = Arrays.stream(arr).sorted((a, b) -> findfirst(b) - findfirst(a)).collect(Collectors.toList());
            System.out.println(flat);
    
        }
    
        private static int findfirst(Integer a) {
            int val = a;
            if(val>=10) {
    
                while (val >= 10) {
                    val = val / 10;
                }
            }
            return val;
        }

使用 Java 流時,許多問題變得更容易。 在這種情況下,您可以將所有數字轉換為字符串,然后按照從兩個配對中選擇較高字符串值的順序進行排序,然后最后將每個數字連接到一個長數字。

這適用於您的測試數據,但不適用於其他數據集:

List<Integer> list1 = List.of(1,3,9,60);
Comparator<String> compare1 = Comparator.reverseOrder();
String num1 = list1.stream().map(String::valueOf).sorted(compare1).collect(Collectors.joining(""));

比較器Comparator.reverseOrder()不適用於以相同值開頭的不同長度的數字,因此需要更復雜的比較 function 將值連接起來以決定排序,類似這樣的東西意味着“459”>“45”> “451”

List<Integer> list2 = List.of(1,45,451,449,450,9, 4, 459);
Comparator<String> compare = (a,b) -> (b+a).substring(0, Math.max(a.length(), b.length())).compareTo((a+b).substring(0, Math.max(a.length(), b.length())));
String num2 = list2.stream().map(String::valueOf).sorted(compare).collect(Collectors.joining(""));

... 也許。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM