力扣:反转字符串中的单词、左旋转字符串

前言:单词反转这个题花了很长时间,结果自己写的代码一直出错,跑不出结果,所以索性直接照搬随想录里的代码,借鉴下解题思路。

反转字符串中的单词

题目:
给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

进阶要求:不要使用辅助空间,空间复杂度要求为O(1)。

示例 :

输入:s = " hello world "
输出:“world hello”
解释:反转后的字符串中不能存在前导空格和尾随空格。

思路:

不能使用辅助空间之后,那么只能在原字符串上下功夫了。

想一下,我们将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒序了,那么再把单词反转一下,单词就正过来了。

所以解题思路如下:

  1. 移除多余空格
  2. 将整个字符串反转
  3. 将每个单词反转

本题难点:
在删除单词之间多余空格和字符串首尾空格时,字符串首尾空格要单独处理。用到两个指针,分别指向字符串首尾,当遇到空格时往前(或往后)移一位,最终两个首尾指针的位置即为需要遍历单词的循环的起点和终点。

其次,在最后一步反转每个单词的步骤中,需要加上对空字符**‘\0’**的判定,不然结果会出错。
代码如下:

//先移除多余空格---元素移除
//再全部逆序
//再单词逆序
void removeExtraSpace(char* s) {
    int start = 0; // 指向字符串开头的指针
    int end = strlen(s) - 1; // 指向字符串结尾的指针
    while (s[start] == ' ') start++; // 移动指针 start,直到找到第一个非空格字符
    while (s[end] == ' ') end--; // 移动指针 end,直到找到第一个非空格字符
    int slow = 0; // 指向新字符串的下一个写入位置的指针
    for (int i = start; i <= end; i++) { // 遍历整个字符串
        if (s[i] == ' ' && s[i+1] == ' ')  { // 如果当前字符是空格,并且下一个字符也是空格,则跳过
            continue;
        }
        s[slow] = s[i]; // 否则,将当前字符复制到新字符串的 slow 位置
        slow++; // 将 slow 指针向后移动
    }
    s[slow] = '\0'; // 在新字符串的末尾添加一个空字符
}

void reverse(char * s, int start, int end){
    for (int i = start, j = end; i < j; i++, j--) {
        char tmp = s[i];
        s[i] = s[j];
        s[j] = tmp;
    }
}

char * reverseWords(char * s){
    removeExtraSpace(s);
    int len = strlen(s);
    reverse(s,0,len-1);
    int i,pre;
    for(i = 0,pre = 0; i <= len; i++){
        if(s[i] == ' ' || s[i] == '\0'){//这里需要加上对空字符的判断
            reverse(s,pre,i-1);
            pre = i+1;
        }
    }
    return s;
}

左旋转字符串

题目:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

思路:本题简单,只需三步。

  1. 反转区间为前n的子串
  2. 反转区间为n到末尾的子串
  3. 反转整个字符串

代码如下:

void reverse(char * s, int start, int end){
    for (int i = start, j = end; i < j; i++, j--) {
        char tmp = s[i];
        s[i] = s[j];
        s[j] = tmp;
    }
}

char* reverseLeftWords(char* s, int n){
    int len = strlen(s);
    reverse(s,0,len-1);
    reverse(s,0,len-n-1);
    reverse(s,len-n,len-1);
    return s;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值