Поменять местами символы в Java, сохранив некоторые на месте

#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--;
}