該問題如果採用暴力方法:從前往後遍歷,如果遇到空格,開始整體資料向後移動2位,插入%20
,一直到結束。採用這樣的方法,時間複雜度為o(n
2)
o(n^2)
o(n2
),比較耗時間,也不是理想的方案。
上面的方案,可以看出有很大的改進空間,如果知道了空格的個數,直接從後往前遍歷,這樣每個元素都能放到最終位置,而不是向暴力方法那樣移動很多步。即:從前往後進行遍歷,找到字串中空格的個數,然後從後往前遍歷,放入最終位置。
**:
#include
#include
using namespace std;
void
replacespace
(char
*str,
int length)
for(
int i =
0; str[i]
!=null
; i++)if
(str_len + cnt *
2> length)
return
;//length += cnt;
int new_len = str_len + cnt *2;
str[new_len +1]
='\0'
;for
(int i = new_len; i >=
0&& cnt >0;
--i)
else
--str_len;}}
intmain
(int argc,
char
*ar**)
其他:
本來很簡單的題目,但自己沒有設定好邊界條件,加上寫的過程中有幾個小bug,除錯了一會兒才發現問題,耗時1h才完全解決。太久不寫**的鍋?
寫作中遇到的幾個bug:
str[new_len] = '\0';
總長度是怎麼回事沒想清楚
for (int i = new_len -1; i >= 0 && cnt >= 0; --i)
這裡還是對新增後的陣列是怎樣的情況不清晰,同時cnt這裡的判斷應該是cnt>0
,不然設定這樣的判斷沒任何效果。
str[i] = str[str_len -- ];
這裡只有在if中str_len才-1,導致程式崩了。。。
幾個點:邊界條件這些應該在開始之前就想清楚,而不是寫好後再找bug。此時這些bug潛藏得比較深,不容易發現。
劍指offer 4 替換空格
1.c c 中每個字串都以字元 0 作為結尾。string s a coutcoutcout2.當幾個指標賦給相同的常量字串時,它們實際上會指向相同的記憶體位址。但用常量記憶體初始化陣列,情況卻有所不同。char c1 a char c2 a char c3 a char c4 a cout c1 ...
劍指offer(4)替換空格
看到替換,我們首先應該想到的是原來乙個空格字元,替換之後變成 2 和 0 這3個字元,因此字串會變長。首先我們要向面試官詢問是新建字串還是在原有字串上面修改,本體要求是在原有字串上進行修改。思路1 如果從前到後遍歷,遇到空格,就替換 空格後面字元需要自後向前向後移動兩個空格 那麼時間複雜度是o n2...
劍指offer 替換空格
思路 首先遍歷字串,找出空格的數量countspace,計算變換後的總長為newlength str.length 2 countspace。定義心得字元陣列,長度為newlength 從字串的後面開始複製和替換,如果不是空格,就複製,如果是空格,就變為 20.難點 牛客網上傳入引數是stringb...