替換字串中的空格

2021-09-06 09:08:35 字數 2775 閱讀 4070

題目:實現乙個函式,要求吧字串中的所有空格替換成「%20」。例如「hello world "  

——>

」hello%20world%20"

實際背景:在網路程式設計中,如果url引數中含有特殊的字元,如空格、'#'等,導致伺服器端無法識別時,就把這些特殊的字元轉換成可以識別的字元。規則:%加上十六進製制的ascii碼,例如『#』的ascii碼是0x23(16進製制),就替換成%23,看下圖位址列中,輸入「hello#hao"

分析:

注意:在c語言中存字串最後一位是認為」\0「的,例如a = "12",那麼a的長度為3,a[0]='1',a[1]='2',a[2]='\0',『\0』是空字元,其ascii碼為0如下圖。相比之下:b = 長度則為2.

思路一:可以再造乙個陣列,遇到空格就替換成」%20「這樣就造成了空間的浪費,可以實現但不是最佳

思路二:

思路三:因為把空格替換為」%20「,每次替換多2個字元,因此可以統計出字串中空格的總個數,然後新陣列大小為  「原陣列大小 + 2*空格數」。從後往前處理:遇到非空格,直接搬到後面,遇到空格替換為」%20「. 直到待插入位置指標和原陣列為指標重合位置。圖示如下:

}執行結果:

這樣實現的時間複雜度為o(n),又不浪費多餘的空間。

舉一反三:

有兩個排好序(公升序)的兩個陣列a1,a2,如何高效的把a2的元素複製到a1的後邊(假設a1後邊有足夠的空間)

思路相同

參考**

#include #include 

int replaceblack(int *a, int *b, int lena, int lenb, int

length)

while(lenb != -1

) a[i--] = b[lenb--];

token = 1

; }

return

token;

}int

main()

, b = ;

int lena = 4, lenb = 3

;

if(0 != replaceblack(a, b, lena , lenb, length))

for(i = 0; i< lena+lenb; i++)

printf(

"%d\n

", a[i]);

return0;

}

注意幾個技術細節問題1.strlen與sizeof的區別與聯絡陣列作為引數傳遞給函式時,傳遞的是指標不是陣列。例如fuc(char *a),在函式中計算sizeof(a) 是指標的大小4(32位系統)或8(64位系 統)

程式演示

#include #include 

void fuc1(char *p)

intmain()

結果

2. 動態陣列和靜態陣列的區別

宣告

動態陣列如:char *a = (char *)malloc(sizeof(char) * 100);  由程式設計師自己分配空間

靜態陣列如:char a[100];由作業系統非配空間

初始化

在宣告中靜態陣列是可以的,如:char a[100]=」hello",但是動態的不可以。

**c中的malloc和free:

字串中的替換空格

題目 把字串中的每個空格替換成 20 思路 直觀的做法是從頭到尾掃瞄字串,遇到空格就做替換,然而由於將乙個字元替換成3個字元,我們必須將空格後面的所有字元都後移兩個位元組。這樣沒次遇到空格,都會移動字元。對於這種問題,當字串 或陣列 長度變大,從前往後操作時移動次數多時,可以考慮從後往前操作。ps ...

替換字串中的空格

這是乙個關於字串的題目,解決這個問題有如下方法。最直觀的方法,利用輔助空間,開始遍歷原字串,是空格則在輔助空間中用 20 字串替代,不是則直接複製到輔助空間中。此方法時間複雜度為o n 空間複雜度為o n 因為需要遍歷原字串,所以時間複雜度不能縮減。如果考慮空間複雜度為o 1 有一種從空間複雜度概念...

替換字串中的空格

替換字串中的空格的方法有很多,在這裡我們實現一種時間複雜度與空間複雜度都為o n 的方法,使用c 語言實現。例如字串talk is cheap show me the code,我們要將其替換為talk is cheap show me the code,並且列印到螢幕上。方 述 定義乙個字元型指標...