題目:實現乙個函式,要求吧字串中的所有空格替換成「%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注意幾個技術細節問題1.strlen與sizeof的區別與聯絡陣列作為引數傳遞給函式時,傳遞的是指標不是陣列。例如fuc(char *a),在函式中計算sizeof(a) 是指標的大小4(32位系統)或8(64位系 統)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;
}
程式演示
#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,並且列印到螢幕上。方 述 定義乙個字元型指標...