Сортировка символов в строке с помощью сортировки по выбору

В чем ошибка в моем коде?

Для строки, состоящей из строчных букв, расположите все буквы в порядке возрастания.

Входные данные: первая строка входных данных содержит T, обозначающее количество тестов. Затем следует описание каждого теста. Первая строка тестового примера содержит положительное целое число N, обозначающее длину строки. Вторая строка содержит строку.

Вывод: для каждого теста выведите отсортированную строку.

Ограничения:

1 <= T <= 100
1 <= N <= 100
import java.util.*;
class GFG {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for (int i = 1; i <= t; i++) {
            int n = sc.nextInt();
            sc.nextLine();
            String S = sc.nextLine();
            String sor = "";
            for (int j = 0; j < n; j++) {
                int min = j;
                for (int k = j + 1; k < n; k++) {
                    if (S.charAt(k) > S.charAt(min)) {
                        min = k;
                    }
                }
                sor += S.substring(min, min + 1);
            }
            System.out.println(sor);
        }
    }
}

Для ввода:

1
5
edcab

Выход:

edcbb

Ожидаемый результат:

abcde

person Shivam Mishra    schedule 06.12.2020    source источник


Ответы (3)


import java.util.*;

class GFG {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for (int i = 1; i <= t; i++) {
            int n = sc.nextInt();
            sc.nextLine();
            
            String S = sc.nextLine();
            System.out.println("S: "+S);
            String sor = "";
            for (int j = 0; n > 0; j++) {
                int min = 0;
                for (int k = 0; k < n; k++) {
                    if (S.charAt(k) < S.charAt(min)) {
                        min = k;
                    }
                }
                sor += S.substring(min, min + 1);
                S = S.substring(0, min) + S.substring(min + 1);
                n--;
            }
            System.out.println(sor);
        }
    }
}

Этот код делает то, что вы хотите. Я изменил ›на‹ и удалил все символы, которые добавлялись в отсортированную строку из несортированной строки. Таким образом, нам не нужно снова и снова иметь дело с одним и тем же символом.

person Berdan Akyürek    schedule 06.12.2020

Вы не меняете место символа min после его нахождения. Но String в java неизменяемы, поэтому вы не можете поменять местами символы в нем. Я предлагаю вам преобразовать вашу строку в char[], чтобы вы могли поменять местами символы:


public static void main (String[] args){
     Scanner sc = new Scanner(System.in);
     int t = sc.nextInt();
     for(int i=1; i<=t; i++){
         int n = sc.nextInt();
         sc.nextLine();
         String S = sc.nextLine().toCharArray(); // convert it to char array
         char[] sor = new char[S.length];
         for(int j=0; j<n; j++){
             int min = j;
             for(int k =j+1; k<n; k++){
                 if(S[k]<S[min]){
                     min = k;
                 }
             }
             swap(S, min, j);
             sor[j] = S[min]
         }
         System.out.println(new String(sor));// reconvert to string
     }
}
public static void swap(char[] c,int x,int y){
    char temp= c[x];
    c[x] = c[y];
    c[y] = temp;
}

person Omid.N    schedule 06.12.2020

Вы можете использовать String.toCharArray для перебора массива символов char[] этой строки, сортировки их десятичных значений и возврата строки, содержащей символы отсортированного массива:

public static void main(String[] args) {
    String str = "edcab";
    String sorted = selectionSort(str.toCharArray());
    System.out.println(sorted); // abcde
}
public static String selectionSort(char[] arr) {
    // iterate over all subsets of the array
    // (0-last, 1-last, 2-last, 3-last, ...)
    for (int i = 0; i < arr.length; i++) {
        // assume the min is
        // the first element
        char min = arr[i];
        // index of the
        // min element
        int min_i = i;
        // check the elements
        // after i to find
        // the smallest
        for (int j = i + 1; j < arr.length; j++) {
            // if this element
            // is less, then it
            // is the new min
            if (arr[j] < min) {
                min = arr[j];
                min_i = j;
            }
        }
        // if min element is not
        // equal to the current
        // one, then swap them
        if (i != min_i) {
            char temp = arr[i];
            arr[i] = arr[min_i];
            arr[min_i] = temp;
        }
    }
    return String.valueOf(arr);
}

Вы можете использовать _ 5_ для перебора int значений символов этой строки, их сортировки и сбора другой отсортированной строки:

String str = "edcab";

String sorted = str.codePoints()
        .sorted()
        .mapToObj(Character::toString)
        .collect(Collectors.joining());

System.out.println(sorted); // abcde

См. также:
Как не использовать специальные символы при проверке пароля (без регулярного выражения)?
Сортировка выбора Java

person Community    schedule 26.12.2020