Java中的字符串反转字符,同时保留一些字符 1 月,2 周 Questions & Answers 2423 我有一个字符串,希望将其反转,以便某些字符被反转,而其他字符保持不变。我如何实现这一点(例如,假设我希望所有字母都反转,而所有数字都保持不变)
# 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 楼答案 您可以为其创建自动机: 迭代字符串,将每个字母插入堆栈,并用原始字符串中不存在的特殊字符(即$)替换它,完全不更改数字。 再次迭代该字符串,将每个$替换为堆栈头。 注意:由于字符串是不可变的,您需要首先将其导出到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)
# 1 楼答案
听起来好像你想要像myReverse(“a1b2c3d”)这样的东西变成“d1c2b3a”
使用两个索引,一个从字符串的每一端开始,寻找可交换的字符
下面是一些伪代码:
# 2 楼答案
您可以为其创建自动机:
迭代字符串,将每个字母插入堆栈,并用原始字符串中不存在的特殊字符(即$)替换它,完全不更改数字。
再次迭代该字符串,将每个$替换为堆栈头。
注意:由于字符串是不可变的,您需要首先将其导出到StringBuilder或CharSequence
编辑
例如:
结果将是
t45setgni1rtsa
复杂性是O(n):迭代字符串(两次)-因为所有堆栈操作都是O(1)