我有一个字符串,我想颠倒它,使一些字符被颠倒,而另一些字符则保持不变。我如何实现这一点(例如,假设我希望所有字母颠倒,而所有数字保持不变)?
发布于 2011-04-17 08:36:32
你可以为它创建一个自动机:
遍历字符串,将每个字母插入到堆栈中,并将其替换为不在原始字符串中的特殊字符(即$),根本不更改数字。
再次迭代字符串,将每个$替换为堆栈的头部。
注意:由于字符串是不可变的,因此您需要首先将其导出为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)。
发布于 2011-04-17 08:47:12
听起来你想让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--;
}
https://stackoverflow.com/questions/5692472
复制