码迷,mamicode.com
首页 > 其他好文 > 详细

【leetcode】Reverse Words in a String(hard)☆

时间:2015-04-17 18:05:36      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:

Given an input string, reverse the string word by word.

For example,
Given s = "the sky is blue",
return "blue is sky the".

For C programmers: Try to solve it in-place in O(1) space.

Clarification:

 

    • What constitutes a word?
      A sequence of non-space characters constitutes a word.
    • Could the input string contain leading or trailing spaces?
      Yes. However, your reversed string should not contain leading or trailing spaces.
    • How about multiple spaces between two words?
      Reduce them to a single space in the reversed string.

 

思路:翻转的思路是很清楚的,就是卡在空格上了。结果专门先循环一遍来去掉空格。

注意,必须改变指针中所对应的值才能改变字符串。

void reverse(char * s, char * e)
{
    while(s < e)
    {
        char tmp = *s;
        *s = *e;
        *e = tmp;
        s++; e--;
    }
}

void reverseWords(char *s) {
    //先专门处理空格
    char * p = s;
    char * snew = s;
    while(*p != \0)
    {
        if(*p !=  ) *snew++ = *p++;
        else if(snew == s) p++; //开始处遇到空格
        else if(*(snew - 1) ==  ) p++; //已经有了一个空格
        else *snew++ = *p++;
    }
    *snew = \0;
    if(*(snew - 1) ==  ) *(snew - 1) = \0;

    //翻转
    char *ss = s;
    int start = 0, end = 0;
    while(*ss != \0)
    {
        while(*ss !=   && *ss != \0)
        {
            ss++;  end++;
        }
        reverse(s + start, s + end - 1);
        if(*ss != \0)
        {
            ss++; end++; start = end;
        }
    }
    reverse(s, s + end - 1);
}

 

看看大神的:不用先去除空格,而是在遍历的过程中用end来更新字符串,去掉空格。

// reverses the part of an array and returns the input array for convenience
public char[] reverse(char[] arr, int i, int j) {
    while (i < j) {
        char tmp = arr[i];
        arr[i++] = arr[j];
        arr[j--] = tmp;
    }
    return arr;
}

public String reverseWords(String s) {
    // reverse the whole string and convert to char array
    char[] str = reverse(s.toCharArray(), 0, s.length()-1);
    int start = 0, end = 0; // start and end positions of a current word
    for (int i = 0; i < str.length; i++) {
        if (str[i] != ‘ ‘) { // if the current char is letter 
            str[end++] = str[i]; // just move this letter to the next free pos
        } else if (i > 0 && str[i-1] != ‘ ‘) { // if the first space after word
            reverse(str, start, end-1); // reverse the word
            str[end++] = ‘ ‘; // and put the space after it
            start = end; // move start position further for the next word
        }
    }
    reverse(str, start, end-1); // reverse the tail word if it‘s there
    // here‘s an ugly return just because we need to return Java‘s String
    // also as there could be spaces at the end of original string 
    // we need to consider redundant space we have put there before
    return new String(str, 0, end > 0 && str[end-1] == ‘ ‘ ? end-1 : end);
}

 

【leetcode】Reverse Words in a String(hard)☆

标签:

原文地址:http://www.cnblogs.com/dplearning/p/4435219.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!