Алгоритм встряхивания - PullRequest
0 голосов
/ 30 апреля 2020

Может кто-нибудь помочь мне с алгоритмом. По сути, если у меня есть слово Hello, я должен взять последнюю букву и поставить на первую позицию, затем взять предпоследнюю букву и поставить ее после второй буквы и так далее, взять третью букву и поставить на третью позицию. Это должно выглядеть следующим образом: Word: Hello 1) oHell 2) oHlel Это мой код, который у меня есть прямо сейчас.

    public static String caesarAlgorithm(
            String word) {
            char[] arr = word.toCharArray();
            int s=arr.length-1;
            for (int i=0; i<arr.length/2; i++) {
                char temp = arr[i]; 
                char temp1=arr[i+1];
                arr[i] = arr[s];
                arr[i+1] = temp;
                s--;
            }
            return new String(arr);
            }
    public static void main(String[] args) {

        System.out.print(caesarAlgorithm("Sokolade"));

    }

}

В моем случае это должно быть выше eSdoaklo Спасибо.

Ответы [ 3 ]

2 голосов
/ 30 апреля 2020

Эта проблема имеет естественную рекурсивную структуру:

static String shake(String str, int n)
{
    if(n == 0) return str;

    String lastChar = str.substring(str.length()-1);
    String firstChar = str.substring(0, 1);
    String middle = str.substring(1, str.length()-1);

    return lastChar + firstChar + shake(middle, n-1);
}

Вызывается через вспомогательную функцию:

static String shake(String str)
{
    return shake(str, str.length()/2);
}

Тест:

System.out.println(shake("Hello"));     
System.out.println(shake("Sokolade"));

Вывод:

oHlel
eSdoaklo
2 голосов
/ 30 апреля 2020

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

public static String caesarAlgorithm(String word) {
    char[] arr = word.toCharArray();
    String result = "";
    for (int i=0; i<arr.length/2; i++) {
        // get the i-th letter from the end and put it in the result string
        result += arr[arr.length-1-i]; // -1 because index starts at 0
        // get the i-th letter from the begining and put it in the result string
        result += arr[i];
    }
    if (arr.length%2 != 0) {
        // in case the number of characters is odd, add the middle character to the end of the string
        result += arr[arr.length%2+1];
    }
    return result;
}

Примечание на стороне:

Имя метода вводит в заблуждение, поскольку не является алгоритмом шифрования Цезаря. С помощью шифра Цезаря вы изменяете все значения символов с одинаковым смещением, но их индекс не изменяется.

0 голосов
/ 30 апреля 2020
     public static String caesarAlgorithm(String word) {
        StringBuilder builder = new StringBuilder();
        int len = word.length();
        int mid = len / 2;
        int i = 0, j = len - 1;
        while (i < mid && j > 0) {
            builder.append(word.charAt(j--) + "").append(word.charAt(i++) + "");
        }
        if (len % 2 != 0)
            builder.append(word.charAt(mid));
        return builder.toString();
    }

, выход

oHlel
eSdoaklo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...