算法刷题 DAY8

344.反转字符串

void reverseString(char* s, int sSize) {
    
    int left=0,right=sSize-1;
    while(left<right){
        int temp=s[left];
        s[left]=s[right];
        s[right]=temp;
        left++;
        right--;
    }
   
}

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<strlen(s)){//再反转每个单词
         while(s[end]!=' '&&end<strlen(s)) end++;
         //涉及指针移动时,在移动前判断是否越界
         reverse(s,start,end-1);
         start=end+1;
         end=start;
     }
     return s;
}

卡码网:54.替换数字 

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

int main(void){
    
    char* s=(char*)calloc(100000,sizeof(char));
    //要在堆上申请空间,不然会报越界
    //要申请远大于10000,(假设都是数字→要5万空间)
    
    scanf("%s",s);
    int count=0;
    for(int i=0;i<strlen(s);i++){
        if(s[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 <stdio.h>
#include <string.h>

void reverse(char *s,int left,int right){
    
    while(left<right){
        int temp=s[left];
        s[left]=s[right];
        s[right]=temp;
        left++;
        right--;
    }
    
}

int main(){
    
    int k=0;
    char s[10000]={'\0'};
    scanf("%d%s",&k,s);
    reverse(s,0,strlen(s)-1);//记得-1🆘;整体反转
    
    if(k>=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);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值