刷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'截断问题谁能给指导一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值