剑指 Offer 45. 把数组排成最小的数
个人思路
题意
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
思路
最初思路
- 将数值型数组转化为字符串数组,通过十进制取模获得每一位数值进行转化
- 按字符升序排列,以满足数字小的在高位,数字大的在高位,但对于(3,30)无法处理到位
正确思路
在定义比较函数时,对两个字符串进行前后拼接,按拼接结果升序排列即可
核心代码
static bool cmp(string s1, string s2){
string temp1 = s1 + s2;
string temp2 = s2 + s1;
return temp1 < temp2;
}
自定义排序函数会出现参数不匹配的问题,需要定义成静态函数。Reference
注意
- 0属于有效字符,需要特殊处理
input:[0, 1]
output:“01”
个人思路代码
class Solution {
public:
string getNum(int num){
string result;
if(num == 0){
result = "0";
}else{
while(num > 0){
int temp = num % 10;
result += temp + '0';
num /= 10;
}
reverse(result.begin(), result.end());
}
return result;
}
static bool cmp(string s1, string s2){
string temp1 = s1 + s2;
string temp2 = s2 + s1;
return temp1 < temp2;
}
string minNumber(vector<int>& nums) {
vector<string> snums;
for(int i = 0; i < nums.size(); ++i){
snums.push_back(getNum(nums[i]));
}
sort(snums.begin(), snums.end(), cmp);
string ans = "";
for(int i = 0; i < snums.size(); ++i){
ans += snums[i];
}
return ans;
}
};