#java #string
#java #строка
Вопрос:
У меня есть строка, и я хочу поменять ее местами, чтобы некоторые символы поменялись местами, в то время как другие остались на месте. Как я могу это реализовать (например, допустим, я хочу, чтобы все буквы поменялись местами, а все цифры остались на месте)?
Комментарии:
1. Вы не можете перевернуть символ — вы можете перевернуть строку. Приведите пример ввода / вывода.
2. @Erik, ‘b’ перевернутым будет ‘d’.
3. @Erik, да, вы правы. Я имел в виду, как показано ниже…
Ответ №1:
Вы можете создать для этого автомат:
выполните итерацию по строке, вставьте каждую букву в стек и замените ее специальным символом, которого нет в исходной строке (т. Е. $), цифры вообще не меняйте.
повторите итерацию по строке еще раз, замените каждый $ заголовком стека.
примечание: поскольку строка неизменяема, вам нужно будет сначала экспортировать ее в StringBuilder или CharSequence
Редактировать
например:
String inp = "a45string1test";
char[] cs = new char[inp.length()];
inp.getChars(0, inp.length(), cs, 0);
Stack<Character> stack = new Stack<Character>();
for (int i =0;i<cs.length;i ) {
if (Character.isDigit(cs[i])) continue;
stack.push(cs[i]);
cs[i] = '$';
}
for (int i=0;i<cs.length;i ) {
if (cs[i] == '$') cs[i] = stack.pop();
}
System.out.println(cs);
результатом будет t45setgni1rtsa
сложность равна O (n): повторение строки (дважды) — поскольку все операции со стеком равны O (1).
Ответ №2:
Похоже, вы хотите, чтобы что-то вроде myReverse («a1b2c3d») было «d1c2b3a».
Используйте два индекса, по одному с каждого конца строки, для поиска заменяемых символов.
Вот некоторый псевдокод:
i1 = 0; i2 = len - 1;
while (i1 < i2) {
while (isCharacterThatShouldNotBeSwapped(str.charAt(i1)) amp;amp; i1 < i2)
i1 ;
while (isCharacterThatShouldNotBeSwapped(str.charAt(i2)) amp;amp; i1 < i2)
i2--;
if (i1 < i2)
swapChars(str, i1, i2); /* swap characters at positions i1 and i2 in str */
i1 ; i2--;
}