【发布时间】:2016-06-15 22:04:55
【问题描述】:
我的问题
我有以下规格:
编写一个函数,给出一个非负整数列表,将它们排列成最大可能的数字。例如,给定 [50, 2, 1, 9],最大的形成数是 95021。
我的结果
我尝试了解决问题的方法,但失败了。例如,给定输入 [90,91,89,999],此代码的结果是 [909199989],但它应该是 [999919089]。
我的算法描述
简单来说,它是基数排序的逆向。
步骤
1) 根据值创建存储桶。
2)每个桶都有元素列表。
3) 对每个桶中的列表进行排序。
4) 以相反的顺序显示结果。
我的代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Scanner;
public class ReverseMaxPossibleNumber {
public static void main(String[] args) {
int[] a = { 50, 2, 1, 9 };
int len = a.length;
String ch = "";
List<Map<String, ArrayList<String>>> list_map = new ArrayList<Map<String, ArrayList<String>>>();
Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
for (int i = 0; i < len; i++) {
ch = "" + a[i];
String str = "";
ArrayList<String> arraylist = new ArrayList<String>();
for (int j = 0; j < len; j++) {
str = "" + a[j];
if (ch.charAt(0) == str.charAt(0)) {
arraylist.add(str);
Collections.sort(arraylist);
map.put("" + ch.charAt(0), arraylist);
}
}
}
list_map.add(map);
String str = "";
for (String key : map.keySet()) {
str = map.get(key) + str;
}
str = str.replaceAll("\\D+", "");
System.out.println(str);
}
}
【问题讨论】:
-
你不能按字母倒序加入他们吗?是在作业中实现排序算法的一部分,还是您可以为该部分使用库函数并且只需要弄清楚如何应用它?
-
@tobias_k 不适用于具有不同位数的数字。即 10, 9 比 910 大
-
使用 Collections.sort() 我正在对每个地图中的列表进行排序。
-
@JimGarrison 哎呀,你是对的。一定是不小心颠倒了排序。但这仍然行不通。考虑数字
4, 45;这里45应该在4之前;但是对于4, 43,4应该排在第一位。 -
我对这个问题投了反对票,原因如下:(1)它询问如何提高空间和时间复杂度的“建议”,而不解释当前的复杂度是什么或需要什么, (2) 核心问题实际上是“我的代码有错误,请更正代码”,这是一个糟糕问题的典型例子。详细的错误是什么?
标签: java algorithm sorting collections