这道题我一开始以为是排列组合的题,但是后来发现,最小的数,就是相应位上,值能够最小的数。
也就是如果对两个字符串拼接顺序进行对比,然后排序,就能够得到,若进行拼接数字,位置一定在给定字符串后面或者前面的元素。
那么最后的排序结果也就是最终的最小值。
这道题不能用排列组合,因为再进行比较的时候,各个元素的和相加,值会远远大于int上限,若实现String的对比,则长度不一致,难以比较,即使实现了字符串位的值的比较,那也会是一个繁琐的工作,不适合在面试进行。
要注意的细节
String 拼接用StringBuilder,toString
还有快排的实现细节别弄错
答案代码
public String minNumber(int[] nums) {
String[] nums_s = new String[nums.length];
for(int count=0;count<nums.length;count++){
nums_s[count] = nums[count] + "";
}
qSort(nums_s,0,nums.length-1);
StringBuilder res = new StringBuilder();
for(int count = 0;count<nums_s.length;count++){
res.append(nums_s[count]);
}
return res.toString();
}
public void qSort(String[] nums_s,int start,int end){
if(start <end){
int mid = Partitiion(nums_s,start,end);
qSort(nums_s,start,mid-1);
qSort(nums_s,mid+1,end);
}
}
public int Partitiion(String[] nums_s,int start,int end){
int key = start;
int i = start;
int j = end;
while(i<j){
while(i<j&&(nums_s[key] + nums_s[j]).compareTo(nums_s[j] + nums_s[key])<=0){
j--;
}
while(i<j&&(nums_s[key] + nums_s[i]).compareTo(nums_s[i] + nums_s[key])>=0){
i++;
}
swap(i,j,nums_s);
}
swap(key,j,nums_s);
return j;
}
public void swap(int a,int b,String[] nums){
String temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}