有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中的字符串反转字符,同时保留一些字符

我有一个字符串,希望将其反转,以便某些字符被反转,而其他字符保持不变。我如何实现这一点(例如,假设我希望所有字母都反转,而所有数字都保持不变)


共 (2) 个答案

  1. # 1 楼答案

    听起来好像你想要像myReverse(“a1b2c3d”)这样的东西变成“d1c2b3a”

    使用两个索引,一个从字符串的每一端开始,寻找可交换的字符

    下面是一些伪代码:

    i1 = 0; i2 = len - 1;
    while (i1 < i2) {
      while (isCharacterThatShouldNotBeSwapped(str.charAt(i1)) && i1 < i2)
        i1++;
      while (isCharacterThatShouldNotBeSwapped(str.charAt(i2)) && i1 < i2)
        i2 ;
      if (i1 < i2)
        swapChars(str, i1, i2); /* swap characters at positions i1 and i2 in str */
      i1++; i2 ;
    }
    
  2. # 2 楼答案

    您可以为其创建自动机:
    迭代字符串,将每个字母插入堆栈,并用原始字符串中不存在的特殊字符(即$)替换它,完全不更改数字。
    再次迭代该字符串,将每个$替换为堆栈头。
    注意:由于字符串是不可变的,您需要首先将其导出到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)