#yyds干货盘点# 空格替换问题

Posted 芒果_Mango

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点# 空格替换问题相关的知识,希望对你有一定的参考价值。


@TOC


题目


笔者比较笨,所以会写的很详细,方便自己后序复盘和分享给别人!希望大佬们不要嫌弃我的事多~哈哈哈!感谢大佬们支持!


题目链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/


==思路==

  • 根据规律可知,替换之后的长度 = 原来替换前的长度 +空格个数*2 (不包括\\0) ->所以替换后末尾要手动放\\0,或者替换过程把\\0也放过去
  • 所以:第一步:遍历字符串,求出空格个数
  • 求出替换之后的长度记为:newlength 原来的长度记为:length
  • 进行填充,从后往前填充,用两个变量来控制, i 下标范围:[0,length] ->这种情况包含了\\0,要把\\0也替换过去 而若下标范围为:[0,length) ->这种情况是没有把\\0也替换过去,所以最后要在newlength位置手动放\\0
  • pos取值范围:[0,newlength] /[0,newlength)
  • 如果i指向的字符不是空格,就把此时的字符放到pos位置,pos--,i--
  • 如果是空格就放%20到pos位置,pos--三次,i--一次

手动最后位置放\\0


方法1:从后往前替换

写法1:下标范围为:[0,newlength) [0,newlength) 最后拷贝完手动放\\0

#include<stdio.h>
#include<string.h>

void ReplaceSpace(char* str, int length)

        //1.计算空格的个数
        int i = 0;
        int spcount = 0;
        for (i = 0; i < length; i++)
        
            if (str[i] ==  )
                spcount++;
        
        //2.计算替换空格后新的长度和最后的位置
        int newlengh = length + spcount * 2;
        int pos = newlengh - 1;
        //3.从后往前填充
        for (i = length - 1; i >= 0; i--)
        
            //空格
            if (str[i] ==  )
            
                str[pos--] = 0;
                str[pos--] = 2;
                str[pos--] = %;
            
            //非空格
            else
            
                str[pos--] = str[i];
            
        
    //最后手动在newlength位置放\\0
        str[newlengh] = \\0;

int main()

    char arr[20] = " We Are Happy";
    ReplaceSpace(arr, strlen(arr));
    printf("%s\\n", arr);
    return 0;


写法2:下标范围为:[0,newlength][0,newlength] 直接把\\0也后移

void ReplaceSpace(char* str, int length)

    assert(str);
    //统计空格的个数
    int count = 0;
    for (int i = 0; i < length; i++)
    
        if (str[i] ==  )
        
            count++;
        
    
    //计算替换后的长度 = 原来长度+空格个数*2
    int newlength = length + count * 2;
    int pos = newlength;
    //替换 -从后往前覆盖
    //如果不是空格就把pos位置的字符放到pos位置
    //如果是空格就在pos位置往前放%20

    // \\0也要替换,所以长度为:[0,length]
    //从后往前存放
    for (int i = length; i >= 0; i--)
    
        if (str[i] ==  )
        
            //如果是空格就在pos位置往前放 %20
            str[pos--] = 0;
            str[pos--] = 2;
            str[pos--] = %;
        
        else
        
            str[pos--] = str[i];
        
    

int main()

    char arr[50] = " WeAreHappy";
    ReplaceSpace(arr, strlen(arr));
    printf("%s\\n", arr);
    return 0;

方法2:开辟新空间

==思路==:

  • 第一步:遍历字符串,求出空格个数为count
  • 求出替换之后的长度记为:newlength 原来的长度记为:length,newlength = length + count*2 求出字符串的长度是不包含\\0的!!
  • 开辟一个大小为newlength+1大小的数组arr (多加一个空间是为了存放\\0
  • 分别使用变量控制下标 i 控制str数组 j控制arr数组
    如果i指向的不是空格,就把i指向的内容放到arr数组的j位置,i++,j++
    如果是i指向的是空格,就在arr数组后面覆盖%20,j++三次,然后i++跳过空格,
    不管怎样i都要++
  • 最后把arr数组的内容拷贝回去,然后释放掉arr
#include<stdlib.h>
//开辟新空间
void ReplaceSpace(char* str, int length)

    //统计空格个数
    int count = 0;
    int i = 0;
    for (i = 0; i < length; i++)
    
        if (str[i] ==  )
        
            count++;
        
    
    int newlength = length + count * 2;  //计算出的长度不包括\\0
    char* arr = (char*)malloc(sizeof(char) * (newlength+1));//要存放\\0,所以要多开辟一个空间
    if (arr == NULL)
    
        printf("malloc fail\\n");
        exit(-1);
    
    //分别使用变量控制下标 i 控制str数组 j控制arr数组
    //如果i指向的不是空格,就放到arr数组的j位置,i++,j++ 
    //如果是i指向的是空格,就在arr数组中替换为%20,i++一次,j++三次
    //不管怎样i都要++
    int j = 0;
    for (i = 0; i < length; i++)
    
        //i指向的是空格
        if (str[i] ==  )
        
            arr[j++] = %;
            arr[j++] = 2;
            arr[j++] = 0;
        
        else
            
            arr[j++] = str[i];
        
    
    //在newlength位置放\\0
    arr[newlength] = \\0;

    //拷贝回去,把\\0也拷贝过去,所以范围为:[0,newlength]
    for (j = 0; j <=newlength; j++)
    
        str[j] = arr[j];
    
    //最后要释放空间
    free(arr);
    arr = NULL;

int main()

    char arr[50] = "WeAre Happy";
    ReplaceSpace(arr, strlen(arr));
    printf("%s\\n", arr);
    return 0;

代码

char* replaceSpace(char* s)
    /*
  int i = 0;
  int len = strlen(s);
  int count = 0;
  //统计空格个数
  for(i = 0;i<len;i++)
  
      if(s[i] ==  )
      
          count++;
      
  
  //开辟新空间
  int newlength = count*2+len;
  char* str = (char*)malloc(sizeof(char)*(newlength+1));    //多开辟一个空间存放\\0
  int j = 0;
  for(i = 0;i<len;i++)
    
        if(s[i] ==  )
        
            str[j++] = %;
            str[j++] = 2;
            str[j++] = 0;   
        
        else
        
            str[j++] = s[i];
        
    
    str[j] = \\0;
    //或者str[newlength] = \\0  在最后位置放\\0
    return str;
    */

    //法2:原地扩容
    int i = 0;
  int len = strlen(s);
  int count = 0;
  //统计空格个数
  for(i = 0;i<len;i++)
  
      if(s[i] ==  )
      
          count++;
      
  
  //开辟新空间
  int newlength = count*2+len;
  s = (char*)realloc(s,sizeof(char)*(newlength+1));    //多开辟一个空间存放\\0
  //从后往前

  int pos = newlength;
  s[pos] = \\0;
  for(i = len ;i> 0;i--)
  
      if(s[i] ==  )
      
          s[pos--] = 0;
          s[pos--] = 2;
          s[pos--] = %;
      
      else
          s[pos--] = s[i];
      
   
  return s;

以上是关于#yyds干货盘点# 空格替换问题的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#Redux 源码与函数式编程

#yyds干货盘点# 前端歌谣的刷题之路-第四十二题-去掉字符串两端空格

# yyds干货盘点 # 实战篇:盘点Pandas中的factorize()函数妙用

#yyds干货盘点# Java | 关于synchronized相关理解

如何为 .NET 项目自定义强制代码样式规则 #yyds干货盘点#

#yyds干货盘点# leetcode算法题:解数独