算法刷题 DAY8

344.反转字符串

void reverseString(char* s, int sSize) {
    
    int left=0,right=sSize-1;
    while(left

541. 反转字符串II

//一般库函数都是左闭右开
char* reverseStr(char* s, int k) {

    int len = strlen(s);
    for (int i = 0; i < len; i += 2 * k) {//i每次移动2k单位

        if (i + k - 1 < len) {//左闭右闭
            int left = i;
            int right = i + k - 1;
            while (left < right) {
                int temp = s[left];
                s[left] = s[right];
                s[right] = temp;
                left++;
                right--;
            }
            continue;//先把所有大于等于k个元素的情况处理完
        }
        //处理最后小于k个元素的部分
        int left = i;
        int right = len - 1;
        while (left < right) {
            int temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--;
        }
    }

    return s;
}

## 151.翻转字符串里的单词

//erase函数时间复杂度为O(n)
//涉及指针移动时,在移动前判断是否越界
//辅助函数记得写在题目函数外面
void reverse(char* s,int left,int right){//左闭右闭;反转字符串

while (left < right) {
            int temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--;
        }

}

void remove_extra_space(char *s,int left,int right){
int slow=0,fast=0;
for(;fast<=right;fast++){
    if(s[fast]!=' '){
        if(slow!=0) s[slow++]=' ';//除了第一个单词,其余单词前都加一个空格
      while(fast<=right&&s[fast]!=' '){
          //注意是写fast还是s[fast]
          s[slow++]=s[fast];
          fast++;
      }
    }
}
//int i=slow-3;
//printf("fast=%d,slow=%d,s[slow]=%c",fast,slow,s[i]);
//题目也有输出,可直接看题目输出来判断代码问题
s[slow]='\0';//确定新数组长度
}

char* reverseWords(char* s) {
     remove_extra_space(s,0,strlen(s)-1);//先移除多余空格
     reverse(s,0,strlen(s)-1);//再将整个字符串反转
     
     int start=0,end=0;
     while(start

卡码网:54.替换数字 

#include 
#include 

int main(void){
    
    char* s=(char*)calloc(100000,sizeof(char));
    //要在堆上申请空间,不然会报越界
    //要申请远大于10000,(假设都是数字→要5万空间)
    
    scanf("%s",s);
    int count=0;
    for(int i=0;i='0'&&s[i]<='9') count++;
    }
    int new_len=strlen(s)+count*5;
    int old_index=strlen(s)-1;
    int new_index=new_len-1;
    
    for(;old_index>=0;old_index--,new_index--){       
        
        if(s[old_index]>='a'&&s[old_index]<='z') s[new_index]=s[old_index];
        else{
           s[new_index]='r';//是new_index 不是 old_index;
           s[new_index-1]='e';
           s[new_index-2]='b';
           s[new_index-3]='m';
           s[new_index-4]='u';
           s[new_index-5]='n';
           new_index-=5;//是new_index 不是 old_index;
        
        }
     
    }

    printf("%s",s);
}

卡码网:55.右旋转字符串

#include 
#include 

void reverse(char *s,int left,int right){
    
    while(left=1)reverse(s,0,k-1);//第一段反转
    //printf("k= %d,strlen=%d\n",k,strlen(s));
    reverse(s,k,strlen(s)-1);//strlen(s)别写成strlen;反转第二段
    
    printf("%s",s);
}

你可能感兴趣的:(算法,数据结构,c语言)