[英]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);
}
}
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.