我想使用常量空格来反转字符串的单词。问题是单词不能包含连续的空格。我希望将单词之间的所有连续空格减少到一个空格,并忽略前导和尾随空格。我能够实现单词的反转,但是我努力实现删除单词和前导和尾随空格之间的连续空格。有人能帮我吗?
这是我到目前为止所做的:
public char[] reverseWords(char[] s) {
if (s == null)
return null;
int right = 0;
s = reverseString(s, 0, s.length - 1);// get the reversed sentence
//System.out.println(s);
for (int left = 0; left < s.length; left++) {
if (s[left] != ' ') {// for first word
for (right = left; right < s.length && s[right] != ' '; right++)
; // get end of word
s = reverseString(s, left, right - 1);
left =(right - 1);// move left index to end of
// word
// s[left++] = ' ';
}
}
return s;
}
public char[] reverseString(char[] strChars, int start, int end) {
if (strChars == null)
return null;
while (start < end) {
char temp = strChars[start];
strChars[start] = strChars[end];
strChars[end] = temp;
start++;
end--;
}
return strChars;
}
答案 0 :(得分:1)
将会有更容易/更快的方式。我只是想出一个应该善于学习目的的想法。
首先,做你现在拥有的任何事情,反对的话,并保持这些连续的空间不受影响。
然后编写另一种方法来连续删除空格。
有2个指针,从第一个位置开始,它不是空格。
A和B继续前进。
if(A!= B),然后我们s[A] = s[B]; s[B] = ' ';
如果s[A]
和s[A-1]
是空格,则A停止(A现在位于第2个空格),只有B继续向前移动。通过这种方式,A保持相同的位置,并将继续从B复制,直到B给出非空格字符。
当B到达终点时结束。
在伪代码中,它类似于
int a = first position of non-space;
int b = a;
while b < s.size() {
if (a != b) {
s[a] = s[b]
s[b] = ' '
}
if (both s[a] and s[a-1] are space) {
increment b;
// leave a untouched
} else {
increment a;
increment b;
}
}
恒定空间,O(n)时间
另一种方法,可以在翻转单词时处理连续空格的删除:
提示是,反向时包括那些额外的空格。
e.g。给定一个字符串
abc def ghi
L (left)
第一次反向是微不足道的,所以我正在跳过它。提示是,对于第二个单词,您将在第一个空格之后的位置停止L:
cba def ghi
L
反向的“右”侧将成为第一个右边界:
cba def ghi
L R
然后反向进行
cba fed ghi
L R
然后继续找到L的下一个位置再次开始反转:
cba fed ghi
L
采取类似的逻辑
cba fed ghi
L R
然后
cba fed ihg
L R
答案 1 :(得分:1)
一个非常非常简单的单行解决方案是使用REGEX (short for REGular EXpression)。我有两种方法可以做到这一点,我正在使用String#replaceAll()
和String#trim()
方法。所以,这里是:
String line = " Hello World! ";
line = line.replaceAll(" +", " "); // '+' = 1 or more i.e. at least 1.
// Hence it replaces ALL white spaces with a single space.
line = line.trim(); //This 'trims' the String to remove all leading and trailing
// whitespaces.
System.out.println(line); //Output: "Hello World!"
更常见的做法是使用"\\s+"
代替" "
。 (实际上该字符为\s
,但在String
中存储时应使用双斜杠。)您仍然会得到相同的结果。您也可以尝试使用Pattern
- Matcher
方法。