題目一:函式將字串中的字元『※』號移到字串的前部分,前面的非『※』字元後移,但不能改變非字元的先後順序,函式返回串中非』*'字元的數量。(要求盡可能的占用少的時間和輔助空間)。例如:原始串為"au※※toc※※h※※i※ps",處理後為"※※※※※※※autochips",函式返回9。
思路:使用倆個標記i, j都指向字串的末尾,然後i往前走,若遇到非字元則將其位置的值拷到j位置,然後i, j同時向前移動,i走完之後,將j位置到i之間的位置都賦為※。
**如下:
//字串問題:乙個換乙個
int movesigntofroat(char* str)
int count = 0, result = 0;
int len = strlen(str);
int i = len;
int j = i;
while (i >= 0)
i--;
} while (j >= 0) //賦值*
result = len - count;
return result;
}
測試用例:
void print(char* str)
printf("\n");
}int main()
時間複雜度和空間複雜度分別為:o(n),o(1)題目二:將字串中連續的※刪除,只保留乙個※,例如,「a※b※※c※※※d」->"a b c d"思路:使用倆個標記i, j都指向字串的開始,判斷i位置和i + 1位置的值都是※嗎?,若是連續※,則i往後走,若不是連續※,則將i位置的值賦給j位置,最後結束後將j位置置為』\0』.
**如下:
void deletemoreblank(char *str)//o(n),o(1)
else // 不是連續空格
}str[j] = '\0';
}
測試用例:
int main()
時間複雜度和空間複雜度分別為:o(n),o(1)測試結果:
思路:若原字串陣列空間足夠大,遍歷字串,可以得到空格的數目count和字串的長度num,則替換後的總長度len = num + count * 2,然後使用 i 標記原字串的最後乙個字元,j標記len,然後str[len] = 『\0』;字串從後往前遍歷,若是字元,拷貝到 j 位置,若是空格,則 j 位置拷貝 『0』、『2』、』%』,每次拷完 j–;
**如下:
void blanktosign(char* str)
i++;
} j = i + count * 2;
for (; i > 0; i--)
else}}
測試用例:
int main()
測試結果:
劍指offer 替換字串
思路 如果直接替換,就有可能覆蓋修改在字串後面的記憶體。如果建立新的字串並在新的字串上做替換,我們就可以分配足夠多的記憶體。對於任何乙個函式,我們要做哪些基本的檢測 1.傳入的引數有效性 2.函式體邊界的判斷 3.返回值正確返回 void replaceblank char str,int leng...
劍指Offer 替換字串
我是鏈結 2.題目描述 將乙個空格字元 替換為三個字元 20 需要三個字元的空間,則在第乙個空格後的字元需要後挪 2 1格,第二個空格後的字元需要後挪2 2格,第三個空格後的字元需要後挪3 2格 依此類 推。4.思路 遍歷字串記錄其中的空格個數,最後再根據空格的順序後挪該空格後的字串,同時替換空格 ...
劍指offer 字串替換空格
見到這個題目,我們很容易想到 申請一塊新空間,儲存變化後的字串,顯然不是我們想要的結果 由此,我們可以想到如下方法 1 先遍歷一次字串,統計出字串中空格的總數,並可以由此計算出替換之後字串總長度。每替換乙個空格,長度增加2,因此替換以後字串的長度等於原來的長度加上2乘以空格數目。2 然後從後往前開始...