#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
- Используйте
String.toCharArray()
для получения букв вашего слова в форме массива. - Используйте индексированный
for
цикл для поворота символов в массиве. - Создайте новый
String
из измененного массива (используя соответствующий конструктор).
- Используйте
- Используйте
StringBuilder
для сборки слова- Создайте
StringBuilder
с начальной емкостью, равной длине слова. - Выполните итерацию по буквам слова с помощью
CharacterIterator
, добавив их в конструктор в требуемом порядке. Это можно сделать за один проход. - Получите результирующую строку из конструктора.
- Создайте