替换数字
这道题比较简单,遇到字母就copy到新的字符数组,如果是遇到数字,就在新字符数组中加入number的字符串。代码如下:
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#define Max 1000000
int main(){
char res[6*Max];
char s[Max];
scanf("%s",s);
int k = 0;
for(int i = 0;i<strlen(s);i++){
if(islower(s[i])){ //如果是小写字母,直接copy过去
res[k++] = s[i];
}
else if(isdigit(s[i])){ //如果是数字的话,把数字设置为number字符串
res[k++] = 'n';
res[k++] = 'u';
res[k++] = 'm';
res[k++] = 'b';
res[k++] = 'e';
res[k++] = 'r';
}
}
printf("%s",res);
return 0;
}
我这个做法是常规的,申请一个新数组来存放替换后的结果。但如果想要原地修改的话,这时候对数字的修改就得从后往前进行。
反转字符串中的单词
这道题的重点,我觉得是如何以空格为划分界线,把单词这样一个区域划分出来。大致思路参照代码的注释,以及对于代码的划分思路参照下图:
代码如下:
class Solution {
public:
string reverseWords(string s) {
char res[10000];
int pr = 0; //用于记录res数组的遍历
int end = s.size()-1;
int begin = s.size()-1; //用于记录每个单词的起始位置和结束位置
bool finding = false; //用于作为现在是否处于锁定单词区域的一个信号标志
for(int p = s.size()-1;p>=0;p--){
if(s[p]==' ' && finding){ //在finding为true的情况下,遇到空格说明单词划分结束,可以锁定单词的范围begin-end
begin = p+1;
for(int i = begin;i<=end;i++){
res[pr++]=s[i];
}
res[pr++]=' ';
finding = false;
}
if(s[p]!=' '&&finding ==false){ //空格结束,遇到非空字符,表示单词划分开始
finding = true;
end = p;
}
if(p==0&&finding == true){ //如果p已经遍历到0,但是单词划分还没有主动结束,则强行结束
begin = 0;
for(int i = begin;i<=end;i++){
res[pr++]=s[i];
}
res[pr++]=' ';
}
}
res[--pr]=NULL; //统一去除字符串尾部的多余空格
return string(res);
}
};
更省事的方法是使用string.h中的关于字符串处理的split函数,直接以空格作为分隔符返回划分后的第一个首字母,这样迭代提取单词,然后把单词倒序排列。
这道题目在代码随想录中推荐使用的是,原地单词逆转,这里暂时先不看了😜