💫題目介紹:
請實作一個函式,把字串的每個空格替換為"%20",例如輸入"we are happy.",則輸出為"we%20are%20happy.",
💡思路1:
這個題目我們很容易就會想到可以創建一個空間足夠大的陣列,然后將源陣列依次進行拷貝,當遇到空格時將%20放入新陣列中然后進行相應的偏移就可以實作,
代碼實作:
#include <stdio.h>
#include <string.h>
#include <assert.h>
void replace(char* arr, char* arr1)
{
assert(arr && arr1);//判斷輸入有效性
while (*arr != '\0')
{
if (*arr != ' ')
{
*arr1 = *arr;
arr1++;
}
else
{
strncpy(arr1, "%20", 3);
arr1 += 3;
}
arr++;
}
}
int main()
{
char arr[40] = "abc defgx yz";
char arr1[40] = { 0 };
replace(arr, arr1);
printf("%s\n", arr1);
return 0;
}
結果:

💡思路2:
如果不允許創建新陣列只能在原字符陣列的基礎上進行擴展的話,首先我們可以考慮從頭到尾進行一次遍歷字串,每當我們遇到空格的時候,我們需要先將空格后面的字串進行右移這樣才能有足夠的空間來放%20,當下一次遇到空格的時候我們同樣需要這樣操作,直到字串遍歷完成結束回圈,

注意:假設字串長度為n,對每個空格字符,需要移動后面O(n)個字符,因此對含有O(n)個空格的字串而言總共的時間復雜度為O(n^2)(需要用到嵌套回圈),
💡思路3:(最優)
由于上一個思路實作起來較為復雜,所以我們這里有一個更高效簡單的方法來實作,首先我們遍歷字串然后計算出空格數并計算出從原字串開始到原字串的末尾(即指向’\0’)的偏移量a,然后們通過空格數計算出擴展后的字串長度和相應的偏移量b,第二步我們從后往前遍歷,若不為空格則
根據偏移量進行賦值并將偏移量減一(這里用到了arr[i] = *(arr+i), i為偏移量);若為空格則利用偏移量b將%20放到相應位置然后減一,然后將偏移量a減一,直到偏移量小于0結束回圈,

代碼實作:
#include <stdio.h>
#include <assert.h>
void add_arr(char* arr, int capacity)
{
assert(arr && capacity>0);//判斷輸入有效性
int initpoint = 0;
int newpoint = 0;
int num = 0;
while (arr[initpoint] != '\0')
{
initpoint++;
if (arr[initpoint] == ' ')
{
num++;
}
}
newpoint = initpoint + 2 * num;//分別找到原字串'\0'的偏移量和擴展后的字串'\0'的偏移量
if (newpoint > capacity)
{
return;
}//判斷陣列空間夠不夠放下擴展后的字串,若不夠會直接退出函式從而列印原字串
while (initpoint >= 0 && newpoint > initpoint)
{
if (arr[initpoint] == ' ')
{
arr[newpoint--] = '0';
arr[newpoint--] = '2';
arr[newpoint--] = '%';
}
else
{
arr[newpoint--] = arr[initpoint];
}
initpoint--;
}//從后往前進行替換
}
int main()
{
char arr[40] = "we are happy.";
add_arr(arr,40);
printf("%s\n", arr);
return 0;
}
結果:

該思路時間復雜度為O(n),
作者水平有限,若文章有任何問題歡迎私聊或留言,希望和大家一起學習進步!!!
創作不易,再次希望大家👍支持下,謝謝大家🙏
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/300025.html
標籤:其他
上一篇:SLAM各種并行加速方法
下一篇:SSL證書錯誤怎么解決
