Какой самый быстрый способ вращать только определенные элементы в массиве?

#java #arrays #rotation

#java #массивы #вращение

Вопрос:

Я пишу форму word scrambler для строк, которая принимает все буквы, кроме первой и последней, и поворачивает их позиции. Однако я должен смотреть только на буквы от второго до предпоследнего. Как я должен скремблировать только от предпоследней буквы до предпоследней буквы?

например, скремблировать «string» в «srintg»

Я могу вызвать Collections.rotate() для массива символов, созданного путем разделения строки, но это приведет к скремблированию всего слова.

 List<String> newWordList = Arrays.asList(word.split(" "));
Collections.rotate(newWordList, -1);
String newWord = String.join("", newWordList);
  

Я хочу получить вывод «srintg», но вместо этого я получу «rintgs».

Комментарии:

1. Что вы подразумеваете под «самым быстрым способом»? У вас очень большой набор данных, или это для вызова?

2. Вы хотите повернуть только 2-й и 2-й последний? Или все, кроме 1-го и последнего? «принимает все буквы, кроме первой и последней» , » смотрите только на буквы от второй до предпоследней »

Ответ №1:

При условии, что ваше слово достаточно длинное, чтобы оно было разумным (не менее четырех букв), вы можете использовать представленный вами подход, повернув подсписок вашего списка:

 Collections.rotate(newWordList.subList(1, newWordList.size() - 1), -1);
  

List.subList() создает представление части List списка с точной целью избежать необходимости перегрузки List методов версиями, которые работают с индексированными поддиапазонами элементов. Это «быстро» в смысле быстрой записи, и это довольно понятно.

Однако, если вы ищете «быстрый» в смысле производительности, то разделение и объединение строк кажется опрометчивым. Быстроеest, вероятно, не то, что мы можем предложить, поскольку производительность должна быть протестирована, но если бы я искал лучшую производительность, я бы протестировал хотя бы эти общие подходы:

  • Работайте с формой массива вашего word
    1. Используйте String.toCharArray() для получения букв вашего слова в форме массива.
    2. Используйте индексированный for цикл для поворота символов в массиве.
    3. Создайте новый String из измененного массива (используя соответствующий конструктор).
  • Используйте StringBuilder для сборки слова
    1. Создайте StringBuilder с начальной емкостью, равной длине слова.
    2. Выполните итерацию по буквам слова с помощью CharacterIterator , добавив их в конструктор в требуемом порядке. Это можно сделать за один проход.
    3. Получите результирующую строку из конструктора.