day5反转字符串中的单词

题目描述
在这里插入图片描述在这里插入图片描述
解题思路:
方法一:常规解法
要将字符串的每一个单词都反转,只需要将整个字符串都反转过来,再将每个单词反转就可以了。又因为字符串中还可能有多余的空格需要移除,所以这道题总共分为三步:
1.移除多余的空格
2.反转整个字符串
3.反转每一个单词

用 “ the sky is blue ” 举例说明,源字符串长度为 21。

移除多余的空格:“the sky is blue”(此时字符串的长度变为了 15)
反转整个字符串:“eulb si yks eht”
反转每一个单词:“blue is sky the”

// 反转字符串函数
void reverse(char * s,int start,int end) {
	while (start < end) {
		char temp = s[start];
		s[start++] = s[end];
		s[end--] = temp;
	}
}

char * reverseWords(char * s) {
	//1.移除多余的空格
	int len = strlen(s);
	int fast = 0, slow = 0;
	//移除字符串之前的空格
	while (s[fast] == ' ') {
		fast++;
	}
	//移除单词之间多余的空格
	while (fast < len -1) {
		if (s[fast] == ' ' && s[fast + 1] == ' ') {
			fast++;
		} else {
			s[slow++] = s[fast++];
	}	
   // 移除字符串后面的空格
   if (s[fast] == ' ') {
       s[slow] = '\0';
   } else {
   	   s[slow++] = s[fast];
   	   s[slow] = '\0';
   }
// 2.反转整个字符串
  reverse (s , 0, slow-1);
// 3.反转每一个单词
for (int  i = 0; i < slow;i++) {
	int  j = i ;
	while ( j < slow && s[j] ! = ' ') {
		j++;
	}
	reverse(s, i ,j-1);
	i = j;
  }
 return s; 
}

方法二:栈

char * reverseWords(char * s){
    //不是空格就入栈  空格出栈
    int len = strlen(s);
    if (len == 0)  return s;
    char *res = (char *)malloc(sizeof(char) * (len + 1));
    res[len] = '\0';
    char *Stack = (char *)malloc(sizeof(char) *(len + 1));
    int top = 0;
    int i,k = 0;
    for(i = len - 1; i >= 0; i--){ //从后往前扫
        while (i >= 0 && s[i] == ' ') //碰到空格继续i--
            i--;
        while (i >= 0 && s[i] !=' ') //碰到非空格字符进栈,连续进栈,直到碰到空格或i<0
            Stack[top++] = s[i--];
        while (top > 0) //经过上面while判断,此时i指向一个空格字符,栈中已经有一个单词,执行出栈
            res[k++] = Stack[--top];
        res[k++]=' '; //手动补上空格
    }
    k--; //k指向最后一个字符
    while (k >=0 && res[k]== ' ') //当原字符串s第一个字符为空格时,res的后面会多一个空格
        k--;
    res[k+1] = '\0'; //字符串结束标志
    return res;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值