代码随想录刷题-Day8-字符串(补充)
leetcode-344.反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/reverse-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
若可以额外分配空间协助解决则新声明一个相同大小的数组即可,题目要求不能额外分配空间,使用双指针法。
void reverseString(char* s, int sSize){
//printf("%d",sSize);
int left=0;
int right=sSize-1;
while(left<right){
char a=s[left];
s[left]=s[right];
s[right]=a;
left++;
right--;
}
}
leetcode-541.反转字符串||
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/reverse-string-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
char * reverseStr(char * s, int k){
int len=strlen(s);
//printf("%d",len);
int left=0;
//int right=0;
while(left<len){
if(k>(len-left)){ //剩余不足k个,全部反转
int lef=left;
int mid=len-1;
while(lef<mid){
char a=s[lef];
s[lef]=s[mid];
s[mid]=a;
lef++;
mid--;
}
}
else{ //剩余超过k个,反转前k个
int lef=left;
int mid=left+k-1;
while(lef<mid){
char a=s[lef];
s[lef]=s[mid];
s[mid]=a;
lef++;
mid--;
}
}
left+=2*k;
}
return s;
}
leetcode-151.反转字符串中的单词
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串
s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-words-in-a-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
C语言取出字符串中间连续空格方法待确认。
char * reverseWords(char * s){
char ret[10000]={0};
while(s[0]==' '){
s++;
}
int len=strlen(s);
int left=0;
int right=len-1;
while(s[right]==' '){
s[right--]='\0';
len--;
}
//len=strlen(s);
while(left<right){ //字符反转
char a=s[right];
s[right]=s[left];
s[left]=a;
left++;
right--;
}
//单词内反转
int i;
left=0;
right=len-1;
for(i=0;i<=len;i++){
if(s[i]==' ' || i==len){
int i_l=left;
int i_r=i-1;
while(i_l<i_r){
char a=s[i_r];
s[i_r]=s[i_l];
s[i_l]=a;
i_l++;
i_r--;
}
left=i+1;
}
}
return s;
}