151. 反转字符串中的单词

char result[10020];
char* reverseWords(char* s) {
    memset(result,0,sizeof(result));
    int k = -1;
    int j = strlen(s);
    for (j; j >= 0; j--) {
        if ((s[j] != '\0') && (s[j] != ' ')) {
            int i = j;
            for (i; (i >= 0) && (s[i] != ' ');) {
                i--;
            }
            //退出循环该将(i,j]放入数组了
            for (int tmp = i + 1; tmp <= j; tmp++) {
                result[++k] = s[tmp];
            }
            j = i;
            if (i < 0) {
                result[++k] = '\0';
            }
            else {
                while (i >= 0) {
                    if (s[i] == ' ') {
                        i--;
                    }
                    else break;
                }
                if (i == -1) {
                    result[++k] = '\0';
                }
                else {
                    result[++k] = ' ';
                }
            }
        }
    }
    return result;
}

暑假搞太多python了,今天刷道算法题恢复下感觉。先用最暴力的空间复杂度为o(n)做法做此题。遇到了几个困难:

1、leet平台一直给我提示================================================================= ==22==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60200000000f at pc 0x55762f1f2caa bp 0x7fff968f7c90 sp 0x7fff968f7c80 这样的错误,其实我明白实质是访问越界。为什么会越界呢?我仔细模拟执行自己的算法,并不会有越界情况产生啊。。。

直到我灵机一动想到了这一行代码前后顺序如果写反就会有访问越界情况产生;于是乎颠倒顺序,进行修改,debug成功。

2、没加memset之前会有“历史残留”情况出现。

测试样例是这样的,但是当我运行后发现答案一和答案三均对,答案二我的输出是“world hello the” 非常畸形。首先想到的是我不知道后台是怎么调用这个函数的,可能在一个进程中连续调用此函数导致的。但是不应该啊,我的“\0”应该会自动把数组截断的吧。这个地方没研究明白,只是觉得每次刷新字符串就肯定对。于是memset了。

3、还是示例二,发现输出是“word hello ”即多了一个空格。按我的算法跑是肯定不会出错的啊。沿着这个方向检查下去,发现

在这哥们把s[i]错写成result[i]了,读得数自然牛头不对马嘴。改正即对!

                                   

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值