ソードフィンガーオファーインタビュー質問45:配列を最小数に配置します

最初、この質問は順列と組み合わせの質問だと思いましたが、後で、最小の数が対応する位置で最小の値を持つ数であることがわかりました。

つまり、2つの文字列の接続順序を比較してから並べ替えると、番号が接続されている場合に、指定された文字列の後ろまたは前にある必要がある要素を取得できます。

次に、最終的なソート結果が最終的な最小値になります。

 

比較するとき、各要素の合計がintの上限よりもはるかに大きくなるため、この質問では順列と組み合わせを使用できません。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