題目:請實作一個函式,把字串中的每個空格替換成"20%",例如,輸入“We are happy.”則輸出"We%20are%20happy.",
注意:看到這個題目,我們首先應該想到的是原來一個空格字符,替換之后變成'%'、'2'和'0'這3個字符,因此字串會邊長,如果是在原來的字串上進行替換,就有可能覆寫修改在該字串后面的記憶體,如果是創建新的字串并在新的字串上進行替換,那么我們可以自己分配足夠多的記憶體,由于有兩種不同的解決方案,我們應該向面試官問清楚,讓他明確告訴我們他的需求,假設面試官讓我們在原來的字串上進行替換,并且保證輸入的字串后面有足夠多的空余記憶體,
測驗用例:
- 輸入的字串中包含空格(空格位于字串的最前面;空格位于字串的最后面;空格位于字串的中間;字串中有連續多個空格),
- 輸入的字串中沒有空格,
- 特殊輸入測驗(字串是一個nullptr指標;字串是一個空字串;字串只有一個空格字符;字串中有連續多個空格),
測驗代碼:
void test(char* testName, char str[], int length, char expected[]){
if(testName != nullptr){
printf("%s begins: ", testName);
}
replaceBlank(str, length);
if(expected == nullptr && str == nullptr){
printf("passed.\n");
}
else if(expected == nullptr && str != nullptr){
printf("failed.\n");
}
else if(strcmp(str, expected) == 0){
printf("passed.\n");
}
else{
printf("failed.\n");
}
}
//空格在句子中間
void test1(){
const int length = 100;
char str[length] = "hello world";
test("test1", str, length, "hello%20world");
}
//空格在句子開頭
void test2(){
const int length = 100;
char str[length] = " helloworld";
test("test2", str, length, "%20helloworld");
}
//空格在句子末尾
void test3(){
const int length = 100;
char str[length] = "helloworld ";
test("test3", str, length, "helloworld%20");
}
//連續有兩個空格
void test4(){
const int length = 100;
char str[length] = "hello world";
test("test4", str, length, "hello%20%20world");
}
//傳入nullptr
void test5(){
test("test5", nullptr, 0, nullptr);
}
//傳入內容為空字串
void test6(){
const int length = 100;
char str[length] = "";
test("test6", str, length, "");
}
//傳入內容為一個空格的字串
void test7(){
const int length = 100;
char str[length] = " ";
test("test7", str, length, "%20");
}
//傳入的字串沒有空格
void test8(){
const int length = 100;
char str[length] = "helloworld";
test("test8", str, length, "helloworld");
}
//傳入的字串全是空格
void test9(){
const int length = 100;
char str[length] = " ";
test("test9", str, length, "%20%20%20");
}
本題考點:
- 考查應聘者對字串的編程能力,
- 考查應聘者分析時間效率的能力,我們要能清晰地分析出兩種不同方法的時間效率各是多少,
- 考查應聘者對記憶體覆寫是否有高度的警惕,在分析得知字串會變長之后,我們能夠意識到潛在的問題,并主動和面試官溝通以尋找問題的解決方案,
- 考查應聘者的思維能力,在從前到后替換的思路被面試官否定之后,我們能夠迅速先到從后往前替換的方法,這是解決此題的關鍵,
實作代碼:
#include <cstdio>
#include <cstring>
//length為字符陣列str的總容量,大于或等于字串str的實際長度
void replaceBlank(char str[], int length){
if(str == nullptr && length <= 0){
return;
}
//originalLength為字串str的實際長度
int originalLength = 0;
int numberOfBlank = 0;
int i = 0;
while(str[i] != '\0'){
originalLength++;
if(str[i] == ' '){
numberOfBlank++;
}
i++;
}
//newLength為把空格替換成'%20'之后的長度
int newLength = originalLength + numberOfBlank * 2;
if(newLength > length){
return;
}
int indexOfOriginal = originalLength;
int indexOfNew = newLength;
while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal){
if(str[indexOfOriginal] == ' '){
str[indexOfNew--] = '0';
str[indexOfNew--] = '2';
str[indexOfNew--] = '%';
}
else{
str[indexOfNew--] = str[indexOfOriginal];
}
--indexOfOriginal;
}
}
int main(){
test1();
test2();
test3();
test4();
test5();
test6();
test7();
test8();
test9();
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/138792.html
標籤:其他
上一篇:AVL平衡二叉查找樹
