Вопрос 45 на собеседовании с предложением Sword Finger: Расположите массив до наименьшего числа

Сначала я думал, что это вопрос перестановки и комбинации, но позже я обнаружил, что наименьшее число - это число с наименьшим значением в соответствующей позиции.

То есть, если вы сравните порядок сращивания двух строк, а затем отсортируете их, вы можете получить элемент, который должен находиться позади или перед данной строкой, если числа сращиваются.

Тогда окончательный результат сортировки - это окончательное минимальное значение.

 

В этом вопросе нельзя использовать перестановку и комбинацию, потому что при сравнении сумма каждого элемента будет намного больше, чем верхний предел 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
рекомендация