反复的char [] /句子的单词

时间:2014-03-25 02:46:05

标签: java string reverse

我想使用常量空格来反转字符串的单词。问题是单词不能包含连续的空格。我希望将单词之间的所有连续空格减少到一个空格,并忽略前导和尾随空格。我能够实现单词的反转,但是我努力实现删除单词和前导和尾随空格之间的连续空格。有人能帮我吗?

这是我到目前为止所做的:

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

2 个答案:

答案 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方法。