剑指Offer面试题45:把数组排成最小的数

这道题我一开始以为是排列组合的题,但是后来发现,最小的数,就是相应位上,值能够最小的数。

也就是如果对两个字符串拼接顺序进行对比,然后排序,就能够得到,若进行拼接数字,位置一定在给定字符串后面或者前面的元素。

那么最后的排序结果也就是最终的最小值。

这道题不能用排列组合,因为再进行比较的时候,各个元素的和相加,值会远远大于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;
    }

猜你喜欢

转载自blog.csdn.net/qq_40473204/article/details/114553787