1.將乙個字串裡面的空格替換成%20,不考慮字元陣列大小溢位,不得使用庫函式
2.將乙個字串裡面的乙個或多個空格替換成乙個空格
這兩道題都是關於字串替換,不同的是第一道題是將乙個空格替換為3個字元%20,當然這裡任意3個字元都可以,而且只要保證陣列大小足夠大,乙個空格替換成多個也無所謂,本質上是將乙個字元替換成多個字元從而增加原字元的長度。
而第二個的話則是將多個字元(只不過是相同的)替換成乙個字元,從而減小原字串的長度。
對於第一道題,可以這麼考慮,先遍歷字串求取原來的字串長度oldlen和空格個數blanknum,由題可知每多乙個空格字串長度就增加(3-1)個即新字串的長度newlen=oldlen+2*blanknum,最後將原來的字串自後向前拷貝到新的空間,如圖所示,以hi usa為例。
**如下:
void replaceblank(char *str)
//oldlen = p - str;
while (str[oldlen] != '\0')
newlen = oldlen + 2 * blanknum;
while (newlen >= 0)
else
str[newlen--] = str[oldlen--];
}}
對於第二題,我自己是這麼考慮的,還是遍歷整個字串,在遍歷的過程中遇到非空格指標string++,遇到第乙個空格的時候不管還是string++, 直到遇到第二個空格記下第二個空格的位置p=string,然後string指標繼續走看是否還有連續的空格直到遇到非空格,此時string指標指向非空格的位置,然後將string及以後字串拷貝到p以後位置,如圖所示
(即字串is a man\0整體向前移動一位)。
那麼為什麼還要設定乙個q指標來儲存遇到第二個空格時候string的位置呢?
那是因為在拷貝的時候*p++=*string++指標p和string位置都變化了,需要有個q指標儲存之前的位置從而string好定位,來繼續執行迴圈。(移動完字串如下圖)
**如下
void deblank(char *string)
else
else if (flag == 1)
*p = '\0';
//兩種拷貝字串的方法
//while (*p++ = *string++)
// ;
string = q;
}} }
}
c和指標書上給出另一種實現方式,設定兩個指標src和dst,讓src先走,執行src向dst的拷貝,遇到非空格直接拷貝,遇到空格看前面乙個是否是空格,如果不是就拷貝否則就不操作。
**如下
int is_white(int ch)
void deblank(char *string)
} else
} *dst = '\0';
}
字串替換空格
點 抽象問題簡化問題 題意 乙個字串,比如 aaa baea erwe dsa dsa f a 替換其中的空格字元為 20 劍指offer面試題4 思路 這個問題的點在於,如果正常從頭到尾替換的話,每乙個被替換空格,它後面的全部字串都需要做整體移動 所以要設法想出,怎麼能夠減少字串移動 非空格字元需...
替換空格(字串)
思路一 利用string類的replaceall方法 public class solution 思路二 將字串轉換為字元陣列 建立乙個新的stringbuffer的物件,遍歷字元陣列,將不為空格的字元直接存入 當遇到空格時,存入 20 public class solution return st...
字串 替換空格
方法 從後往前替換,先求出字串總長度 空格數 新字串長度,然後兩個指標分別指向原始字串末尾和新字串末尾,依次替換,遇到空格時則替換為 0 2 include includevoid replaceblank char string,int length int newlength originall...