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);
}