题外话吐槽一下
今天参加了某个互联网大厂的笔试,虽然就两道编程题,但是结果惨不忍睹 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