替換數字
這道題比較簡單,遇到字母就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函數,直接以空格作為分隔符返回劃分后的第一個首字母,這樣迭代提取單詞,然后把單詞倒序排列。
這道題目在代碼隨想錄中推薦使用的是,原地單詞逆轉,這里暫時先不看了😜