如果它们都是单个数字,解决方案很简单:对它们进行排序并为结果中最重要的数字(最左边的数字)选择最小的数字。例如在 3 之前选择 2,因为 23 小于 32。
类似的多位数字,按最左边的数字排序。例如在 45 之前选择 123,因为 12345 小于 45123。
最棘手的部分是领带。如果最左边的数字相同,则比较第二个数字,然后是第三个数字......例如在 34 之前选择 321,因为 32134 小于 34321。
最后,如果出现平局而您的数字用完了怎么办?在 3 之前选择 321,因为 3213 小于 3321。
因此,使用 Java 作为一门语言,使用这些规则编写一个比较器(请注意,您可能最好将数字视为字符串,而不是数字),排序,然后连接。其他语言也类似。
比较器的 Java 代码: See also Gist with a main() for testing 请注意,我能够重组和简化规则。这段代码可能可以更好地优化速度。 (注意:假设所有的 int 都首先转换为 Strings 以提高效率)
public class SO25396760 implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
int minLength = Math.min(s1.length(), s2.length());
int result = s1.substring(0, minLength).compareTo(s2.substring(0, minLength));
if (result != 0)
return result;
int lenDiff = s1.length() - s2.length();
if (lenDiff == 0)
return 0; // Strings are equal
if (lenDiff < 0)
return compare(s1, s2.substring(minLength));
else
return compare(s1.substring(minLength), s2);
}
}
当输入为 {"321","3","35", "321334", "333", "2"};排序后的数组是
[2, 321, 321334, 3, 333, 35]
并且连接的值为
2321321334333335。通过检查测试这是最小的。