Как поменять массив символов (на месте) в Java - PullRequest
0 голосов
/ 20 февраля 2019

Таким образом, в основном без возможности / разрешения создать новый массив.Невозможность вернуть что-либо, кроме фактического изменения и манипулирования текущим массивом.Как взять массив символов и просто перевернуть / перевернуть их.

Starting array: ['P','e','r','f','e','c','t',' ','M','a','k','e','s',' ','P','r','a','c','t','i','c','e']

Реверсировать каждое слово, разделенное пробелом

Reversed: ['P','r','a','c','t','i','c','e',' ','M','a','k','e','s',' ','P','e','r','f','e','c','t'] 

Это то, что ядо сих пор

Код:

  class Main {
     public static void main(String[] args) {
       char[] charArr = new char[] {'P','e','r','f','e','c','t',' ','M','a','k','e','s',' ','P','r','a','c','t','i','c','e'};
       reverseCharArray(charArr);
     }


     public static void reverseCharArray() {
       int arrLength = charArr.length;
       for (int i = 0; i <= arrLength / 2; i++) {
         charArr[arrLength - i - 1] = charArr[i];
         System.out.println(charArr);
       }
     }
   }

Обновление: Хорошо, я нашел именно это.Что мне нужно сделать, так это на самом деле поменять слова по буквам предложения символов.Чтобы предложение было перевернуто / перевернуто.

Примечание: это было сделано в онлайн-интервью здесь: введите описание ссылки здесь

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Это определенно не хорошее решение, но оно работает.

class Main {

public static void main(String[] args) {
    char[] charArr = new char[] { 'P', 'e', 'r', 'f', 'e', 'c', 't', ' ', 'M', 'a', 'k', 'e', 's', ' ', 'P', 'r',
            'a', 'c', 't', 'i', 'c', 'e' };
    System.out.println(charArr);
    reverseCharArray(charArr,0);
    System.out.println(charArr);
}


public static void reverseCharArray(char[] charArr, int sorted) {


    /* Look for last space*/
    int lastSpace = -1;
    for (int i = 0; i < charArr.length; i++) { 
        if (charArr[i] == ' ') {
            lastSpace = i; 
        }
    }

    /* Grab the word and move it at the beginning of the sorted array */
    for (int i = lastSpace + 1; i < charArr.length; i++) {

        int k = i;

        while (k != sorted) {
            char tmp = charArr[k-1];
            charArr[k-1] = charArr[k];
            charArr[k] = tmp;
            k--;
        }

        sorted++;
    }


    /* At this point, the last character is a space*/
    /* Else, we've swapped all the words */
    int k = charArr.length - 1;
    if (charArr[k] != ' ') {
        return;
    }

    /* If it's a space, grab it and move it at the beginning*/
    while (k != sorted) {
        char tmp = charArr[k-1];
        charArr[k-1] = charArr[k];
        charArr[k] = tmp;
        k--;
    }
    sorted++;


    /*Recursive call on the not sorted array*/
    reverseCharArray(charArr,sorted);

}}
0 голосов
/ 20 февраля 2019

Допустим, у вас есть следующий массив;[h, e, y, , y, o, u] вам придется работать по шаблону;снаружи внутрь (или наоборот).Итак, [1,2,3,4,3,2,1] вам придется поменять местами 1 и 1, 2 и 2 и так далее.Как вы можете видеть, этот массив имеет длину 7, в этом случае необходимое количество перестановок составляет ровно 4 (4 поменялся местами с собой).Чтобы вычислить количество свопов, вы можете просто ограничить длину массива, деленную на 2.0f.

Теперь вам нужно выполнить цикл по массиву, меняя эти индексы.Чтобы рассчитать, какой индекс нужно поменять, вы должны проверить, на какой своп вы находитесь.Допустим, вы находитесь на втором свопе, индексы 2 в массиве равны 1 и 5, индексы 3 равны 2 и 4. Вы, вероятно, уже узнали шаблон.Первый индекс - это всегда количество выполненных свопов, а второй - длина массива минус 1 за вычетом количества выполненных свопов.

вот это в коде;


    public static void swap(char[] array){
        int totalSwaps = (int) Math.ceil(array.length / 2.0f);
        for(int currentSwaps = 0; currentSwaps < totalSwaps; currentSwaps++){
            char char1 = array[currentSwaps];
            int position2 = array.length - (currentSwaps + 1);
            array[currentSwaps] = array[position2];
            array[position2] = char1;
        }
        System.out.println(Arrays.toString(array));
    }

РЕДАКТИРОВАТЬ: Я только что видел, что вы просили обратить каждое слово в символе [], вы можете уточнить, что в первых предложениях

сделать это;Я бы порекомендовал вам использовать String::split, чтобы разбить строку на строку [] и использовать String::toCharArray, чтобы изменить ее на массив символов.Хотя это создает новые массивы

0 голосов
/ 20 февраля 2019

Метод ниже меняет интервалы.Обратите внимание, что они должны быть одинаковой длины.

public static char[] swap(char[] arr, int lstart, int rstart, int len){
      for(int i=lstart; i<lstart+len; i++){
        char temp = arr[i];
        arr[i] = arr[rstart+i];
        arr[rstart+i] = temp;
   }
   return arr;
}
...