剑指offer45 把数组排成最小(大)数 P227
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323。
这道题是隐藏的大数问题,应该想到用字符串操作,难点在于找到一个新的比较规则来排序数组,其实整数不好比的话,字符串字典序比较很容易想到,按字典序排, 321 ,32,3 拼接起来刚好满足要求。(和书上做法不太一样,这里用string + 可能存在效率问题)
bool cmp(string a, string b) { // 不是a < b
return a + b < b + a; // 看两个字符串相加怎么样字典序最小
}
string minNumber(vector<int> nums) { // 原数组
vector<string> v_str; // 用来把整数转换成string存储
for (auto i : nums) {
v_str.push_back(to_string(i));
}
sort(v_str.begin(), v_str.end(), cmp); // 按字典序排, 321, 32,3
string ans = ""; // 直接加就行
for (auto i : v_str) { // str =str+ "a"加的运算产生的是一个新的对象,再把结果返回,
ans += i; // str += "a"涉及的是对象的引用,操作后返回引用,避免产生新对象。
}
return ans;
}
java
public String minNumber(int[] nums) {
String[] strs = new String[nums.length];
for (int i = 0; i < nums.length; ++i) {
strs[i] = String.valueOf(nums[i]);
}
Arrays.sort(strs, (a, b) -> (a + b).compareTo(b + a));
StringBuilder sb = new StringBuilder();
for (String str : strs) {
sb.append(str);
}
return sb.toString();
}