可以说我有一个数组:
int[] arr = {23, 4, 46, 720, 56};
我如何找到给出最大数字的数字顺序?
例如,在数组 arr 中,顺序为
7205646423
编辑:也可以有 n 位数字,即不一定限于 3。
例如。,
int[] arr = {223, 23, 72, 7, 64, 9};
答案是
97726423223
字典排序是一个好的开始。
但是,当考虑到例如[854, 854853, 854855]
需要排序到时,困难就来了[854855, 854, 854853]
。
解决此问题的一种方法是定义一个比较器来比较数字的连接版本(即比较abc
和def
转换为比较abcdef
和defabc
)。
最简单的版本:
// processing numbers as strings
List<String> array = Arrays.asList("854", "854853", "854855");
Collections.sort(array, new Comparator<String>() {
@Override
public int compare(String o1, String o2)
{
// negative since we want biggest first
return -(o1+o2).compareTo(o2+o1);
}
});
测试。
该compare
函数无需实际连接数字的开销,只需进行就地检查:
@Override
public int compare(String s1, String s2)
{
int i;
int length = s1.length() + s2.length();
for (i = 0; i < length; i++)
{
char c1 = get(s1, s2, i),
c2 = get(s2, s1, i);
if (c1 != c2)
{
return (c1 > c2 ? -1 : 1);
}
}
return 0;
}
private char get(String s1, String s2, int index)
{
if (index < s1.length())
return s1.charAt(index);
else
return s2.charAt(index - s1.length());
}
测试。
我最初有一个更复杂的版本,理论上应该更快一些,因为它有几个 for 循环,索引环绕到另一个数组中,而不是一个循环,检查长度,但简单性胜过性能差异我在这里。如果您有兴趣,请随时查看帖子历史记录(rev 3),但请注意该版本有一个错误 - 在最后一个循环之后,另一个索引应该包装到另一个数组中。