題外話吐槽一下
今天參加了某個互聯網大廠的筆試,雖然就兩道編程題,但是結果慘不忍睹 QAQ~wuuuuuu
最大的認識就是,不管算法基礎有多好,沒有紮實的編程基礎來支持就是空談。
雖然大一的時候學了C++,當時的課設也是自己一行一行碼出來的,但是時間一長不用,很多細節就沒那麼清楚了。所以今天以love and peace的狀態做題,想清楚實現的算法後,開始打代碼的卻發現這也報錯那也報錯,大部分是語法細節,奔潰啊!!
題目描述
好了好了,我們來看看題目吧,當時hin崩潰沒有想到拍下來,我努力複述一下,要求大概是這樣的:
有個叫小強(or小明or小綠)的傢伙會一種“魔法”,可以把一個字符串中任意位置的字符變到這個字符串末尾,比如用一次“魔法”就可以把 clroev 中的 r 移到結尾變成 clovre ,再用一次“魔法”就可以把 clovre 中的 e 移到結尾變成 clover。現在,有兩個字符串S和T,要求用這種“魔法”把S變成T。如果S無法變成T,輸出“-1”。如果S可以變成T,輸出要用“魔法”的次數。 |
代碼實現
// edited by clover ~ ^_^ ~
#include<iostream>
using namespace std;
int main()
{
string S, T;
while (1) {
cin >> S >> T;
if (S.length() == T.length())
{
int num = S.length(), times = 0;
for (int lastchar = num - 1; lastchar >= 0; --lastchar)
{
for (int i = 0; i <= lastchar + 1; ++i)
{
//cout << "i=" << i << ",lastchar=" << lastchar << endl;
if (i == lastchar + 1)
{
cout << "-1";
return 0;
}
//cout << "S[i]=" << S[i] << ",T[lastchar]=" << T[lastchar]<<endl;
if (S[i] == T[lastchar])
{
if (i == lastchar)
{
//cout << "同位置不用變";
break;
}
char temp = S[i];
for (int j = i; j < lastchar; ++j)
{
S[j] = S[j + 1];
}
S[lastchar] = temp;
++times;
//cout << "第" << times << "次改變後:" << S << endl;
break;
}
//else cout << "第" << i << "次嘗試失敗" << endl;
}
}
cout << times<<endl;
}
else
{
//cout << "length does not match!" << endl;
cout << "-1"<<endl;
}
}
}
測試和分析
- 輸入字符串長度不一致時,直接返回-1
aaaa
aaa
-1
- 輸入的S和T一樣時,不用使用“魔法”
aaaa
aaaa
0
- 其它比較普通的例子
haaaaaaaa
aaaaaaaah
1
clover
clorev
2
- 算法沒考慮到的例子(還是有bug的大家見諒,也歡迎大佬們提出優化算法)
像以下這樣的情況,其實只要把第一位移到最後,用一次魔法就行,但是由於算法是從後面開始移動,就會錯誤。
hahahahaha
ahahahahah
5