題目描述:
解題思路有:
#判斷字串是否為空,判斷length是否大於0。
#記錄空格的數量,沒有空格直接返回原字串。
1)考慮的問題:替換字串是在原字串上修改(a)還是新建字串修改(b)
2)在當前字串替換,怎麼替換才更有效率
:
2-1從前往後替換,後面的字元要不斷往後移動,要多次移動,所以效率低下(在原字串改動時)
2-2從後往前,先計算需要多少空間,然後從後往前移動,則每個字元只為移動一次,這樣效率更高一點。
測試用例:
1)輸入中包含空格(空格位於最前方,最後方,中間,有連續多個空格)
"hello world"
2)輸入中沒有空格
3)特殊輸入測試(字串是nullptr指標;字串是空字串)
**:
1new array + front to backclass
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 };
注意:1」主體**line23-34執行結束後,newstr指標內儲存修改後的**。但該段**執行後指標指向'\0'的後一位(因此要多減乙個1),要根據字串長度將指標移回原始位置。(不要忘記指標移動)
2」要修改的是str,因此將newstr的值拷貝給str,函式執行結束後,newstr的被釋放(區域性作用域)。
3」if (str==null||length<=0),使用||而不是&&。
1ori array + back to frontclass
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 };
注意: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 原始字串+從後往前複製(使用指標)
1use pointclass
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 };
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 solutionelse
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 遍歷...