替换数字
这道题比较简单,遇到字母就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-endbegin = 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函数,直接以空格作为分隔符返回划分后的第一个首字母,这样迭代提取单词,然后把单词倒序排列。
这道题目在代码随想录中推荐使用的是,原地单词逆转,这里暂时先不看了😜