刷leetcode的第一道題——Reverse Words in a String

好久沒在Online Judge上做題了,今晚7點就要做阿里校招的在線筆試了,前兩個多小時去leetcode做了一道字符串的題,好多潛在的trick,還好在WA了兩次後終於AC了。

Leetcode第一題Reverse Words in a String,題目很簡單:

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

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

第一次沒點題目的詳細說明,總結trick:

1、前導和後導空格需要去掉,中間多個空格只能保留一個(話說這還是我上次實習面有道的一道題目)

2、字符串只有空格時,返回""


下面貼上代碼,基本上用到的字符串函數都是自己手動實現的(除memmove外),Leetcode的接口居然定義的是string,下面代碼的實現都是char*

class Solution {
public:
    void reverseWords(string &s) {
        if(s.length() == 0 || s == " "){
            s = "";
            return;
        }
        int cnt = 0;
        for(int i = 0 ; i < s.length(); i ++){
            if(s[i] == ' ')
                cnt ++;
            else
                break;
        }
        if(cnt == s.length()){
           s = "";
           return;
        }
        char str[10240];
        strcpy(str ,s.c_str());
        strtrim(str);
        int len = strlength(str);

        int begin = 0;
        for (int i = 0; i < len; i ++) {
            if (str[i] == ' ') {
                reverse(str,begin,i - 1);
                begin = i + 1;
            }
        }
        reverse(str, begin, len - 1);
        reverse(str,0,len-1);
        for (int i = 0; i < len ; i ++) {
           s[i] = str[i];
        }
        s.resize(len);
    }

    int strlength(const char *str){
        const char *pstr = str;
        while (*pstr ++ != '\0');
        return pstr - str - 1;
    }

    void swap(char &a,char &b) {
        char tmp = a;
        a  = b;
        b = tmp;
    }

    void strtrim(char *str){//去除空格
        char *pstr = str;
        int len = strlen(str);
        int from = 0, to = 0;
        while(*pstr == ' ') {
            pstr++;
            from ++;
        }
        pstr = str + len - 1;
        while(*pstr == ' ') {
            pstr --;
            to ++;
        }
        memmove(str,str+from,len - from - to);
        *(str + len - from - to) = '\0';
        pstr = str;
        char *ts = str;
        while(*pstr != '\0'){
            if(*pstr != ' '){
                *ts = *pstr;
                ts++;
                pstr++;
            }else{
                while(*pstr == ' ') pstr ++;
                *ts ++ = ' ';
            }
        }
        *(ts++) = '\0';
    }

    void reverse(char *str, int from, int to) {
        char *pbegin = str + from;
        char *pend = str + to;
        while (pbegin <= pend) {
            swap(*pbegin++, *pend --);
        }
    }
};


代碼寫的不好,'\0'截斷問題誰能給指導一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章