将一個字元串中的空格換成#号
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<assert.h>
//空格替換
void addcharactr(char* crr, char c, int len) {
assert(crr != NULL );
for (int i = 0; i < len-1 ; i++) {
if (crr[i] == ' ') {
crr[i] = c;
}
}
}
int main() {
char crr[100] = "i am a student";
char c = '#';
int len = strlen(crr);
addcharactr(crr, c,len);
for (int i = 0; i <len; i++) {
printf("%c", crr[i]);
}
return 0;
}
當用 i am a student 作為測試用例時,結果如下
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicWZwpmL1ADM1kzYxYjY4YmN1kjNiJzN4QDZ4UjMmNTNhVTM2QzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpeg)
得到結果如下,其中strlen和字元串的輸入方式的使用可以參考以下連結
https://blog.csdn.net/iccoke/article/details/125911524?spm=1001.2014.3001.5502
将一個字元串中的空格替換為兩個#号
這裡首先要想到的是這裡涉及到了元素的移動問題,我們這裡的初步想法是從o号下标周遊數組,當遇到空格時,将後面的所有元素全部移動到後一位,這樣空格處和後一處就有兩個空格,然後依次填入兩個#即可,但是在移動資料時首先應該考慮是否會在移動元素的過程中産生越界導緻的程式崩潰發生。
具體代碼如下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<assert.h>
//空格替換
void addcharactr(char* crr, char c, int m, int len) {
assert(crr != NULL && m <= len);
int len1 = len + m;
for (int i = 0; i < len1-1 ; i++) {
if (crr[i] == ' ') {
for (int j = len1-1; j >= i + 1; j--) {
crr[j + 1] = crr[j];
}
crr[i] = c;
crr[i + 1] = c;
}
}
}
int main() {
char crr[100] = "i am a student";
char c = '#';
int len = strlen(crr);
int m = 3;
addcharactr(crr, c,m,len);
for (int i = 0; i <len+m; i++) {
printf("%c", crr[i]);
}
return 0;
}
依舊以i am a student 作為測試用例
結果為
可以看到以上代碼可以實作題目需求,但是我們觀察代碼不難發現,代碼的時間複雜度很高,是以我們要對代碼進行優化
時間複雜度相關知識
https://blog.csdn.net/iccoke/article/details/125907349?spm=1001.2014.3001.5502
優化後代碼如下
int getcount(char* arr,int len,char c) {
assert(arr != NULL);
int count = 0;
for (int i = 0; i < len; i++) {
if (arr[i] == c) {
count++;
}
}
return count;
}
void addcharcater(char* arr,char c,int len,char b) {
assert(arr != NULL);
int count = getcount(arr, len, c);
int i = len; int j = i + count;
while (i != j) {
if (arr[i] != c) {
arr[j--] = arr[i--];
}
else
{
arr[j--] = b;
arr[j--] = b;
i--;
}
}
}
int main() {
char arr[100] = "i am a student";
int len = strlen(arr);
char c = ' ';
char b = '#';
addcharcater(arr, c, len, b);
printf("%s", arr);
}
相比較第一次的代碼,這段代碼的時間複雜度就小了很多
但是為了能夠适用更多的情況,比如将一個字元串中的某個字元替換為其他n個字元這樣比較普通的情況,我們要進行進一步的優化
int getcount(char* arr,int len,char c) {
assert(arr != NULL);
int count = 0;
for (int i = 0; i < len; i++) {
if (arr[i] == c) {
count++;
}
}
return count;
}
void addcharcater(char* arr,char c,int len,char b,int num) {
assert(arr != NULL);
int count = getcount(arr, len, c);
int i = len; int j = i + count*(num-1);
while (i != j) {
if (arr[i] != c) {
arr[j--] = arr[i--];
}
else
{
for (int z = 0; z < num; z++) {
arr[j--] = b;
}
i--;
}
}
}
int main() {
char arr[100] = "i am a student";
int len = strlen(arr);
char c = 'a';
char b = '!';
addcharcater(arr, c, len, b,5);
printf("%s", arr);
}
用将字元串中的a換成五個!作為測試用例
結果如下