05 替換空格

2022-08-18 01:45:15 字數 3252 閱讀 8108

題目描述:

解題思路有:

#判斷字串是否為空,判斷length是否大於0。

#記錄空格的數量,沒有空格直接返回原字串。

1)考慮的問題:替換字串是在原字串上修改(a)還是新建字串修改(b)

2)在當前字串替換,怎麼替換才更有效率

2-1從前往後替換,後面的字元要不斷往後移動,要多次移動,所以效率低下(在原字串改動時)

2-2從後往前,先計算需要多少空間,然後從後往前移動,則每個字元只為移動一次,這樣效率更高一點。

測試用例:

1)輸入中包含空格(空格位於最前方,最後方,中間,有連續多個空格)

"hello world"

2)輸入中沒有空格

3)特殊輸入測試(字串是nullptr指標;字串是空字串)

**:

1

class

solution

1617

if (index.empty()) //

判斷是否有空格

18return;19

else

32else

33 *newstr++=*str++;34}

35 newstr=newstr-(totallength+spacenum*2)-1

;36 str=str-totallength-1;37

for(int j=0;j<=(totallength+spacenum*2);j++)40}

41}42 };

new array + front to back

注意:1」主體**line23-34執行結束後,newstr指標內儲存修改後的**。但該段**執行後指標指向'\0'的後一位(因此要多減乙個1),要根據字串長度將指標移回原始位置。(不要忘記指標移動)

2」要修改的是str,因此將newstr的值拷貝給str,函式執行結束後,newstr的被釋放(區域性作用域)。

3」if (str==null||length<=0),使用||而不是&&。

1

class

solution

12int totalnew = totallen +2*spacenum;

13//

注意:c++中u取反使用!,而不是~(~1=-2,結果是true)

14if(!spacenum||totalnew>length) //

totalnew>length(應該是大於符號)

15return;16

for(int k = totallen,j=totalnew;k>=0;k--,j--)

24else27}

28}29 };

ori array + back to front

注意:1」c++中,取反使用!(即int spacenum =1; !spacenum; 結果是0)

而~spacenum 結果是-2(true)

2」~20=-21,規律如下:

20的原碼:0001 0100

~操作:1110 1011(逐位取反)這是乙個負數,負數在計算機中以補碼形式儲存。因此該序列是乙個負數的補碼。

該負數的補碼:1110 1011

該負數的反碼:1110 1010 (減1)

該負數的原碼:1001 0101(首位是符號位,-1)(0010101為21)。最後結果為-21。

c 原始字串+從後往前複製(使用指標)

1

class

solution

14int len =originallength+2*countofblanks;

15if(len+1>length||!countofblanks) //

即:len>=length

16return;17

18char*pstr1=str+originallength;//

複製結束符『\0』

19char*pstr2=str+len;

20while(pstr1

2128

else

2932 --pstr1;33}

34}35 };

use point

1」當兩個指標相等的時候,終止。(此時已經沒有空格了)

編寫**時遇到的問題:

1)判斷字串(char *str)是否為空:if(str==null)

2)判斷某個字元是否是空格(兩種方法):isspace(str[i]) 或 if(str[i]==' ')

基礎知識:

1)字串的最後乙個字元是'\0',用於判斷乙個字串是否結束。

2)編寫程式時,一定要考慮極端的情況,如要查詢的陣列是空的,字串是空的,要賦值的物件是同乙個物件等。

3)原碼:乙個正數,轉換為二進位制位就是這個正數的原碼。負數的絕對值轉換成二進位制位然後在高位補1就是這個負數的原碼

反碼:正數的反碼就是原碼,負數的反碼等於原碼除符號位以外所有的位取反

補碼:正數的補碼與原碼相同,負數的補碼為 其原碼除符號位外所有位取反(得到反碼了),然後最低位加1

即:正數的反碼和補碼都與原碼相同。

在計算機中,正數是直接用原碼表示的,負數用補碼表示!

仍存在的問題:

1)length是指什麼?

猜測:限定原始字串指標str可擴充套件的記憶體空間,即記錄總長度。

# prac 02

class solution 

else

for (int k = 0;kprac autumn

class solution

//int sz = length + count*2; //此處length指的並不是str的長度

//p--; //不用p--,會報錯。字串的'\0'也拷貝過去

char *tail = p + count*2;

while(p!=tail)else

}return;

}};

05 替換空格

限制 0 s 的長度 10000 1 看到此題第一反應是使用str.replace oldstr,newstr 但時間複雜度較高 2 另謀出路,將字串轉為字元陣列處理,挨個遍歷字元。新建乙個字元陣列用於儲存替換後的結果,長度為字串長度三倍 因為乙個空格替換為 20,也就是乙個字元替換為三個字元,極端...

05 替換空格 python

def replace space s s list s l1 len s cnt 0 if l1 1 return none for ss in s if ss cnt 1 l2 l1 cnt 2 s.extend cnt 2 i j l1 1,l2 1 while i 0 if s i s j ...

替換空格 劍指Offer 05 替換空格

請實現乙個函式,把字串 s 中的每個空格替換成 20 在python語言中,字串被設計成不可變型別,即無法直接修改字串的某一位字元,需要新建乙個字串實現。初始化乙個list 遍歷字串s中每個字元c,若c為空格,則在list中新增 20 若c不為空格,則在list中新增字元c。時間複雜度 o n 遍歷...