昨晚收到面试邀请后就开始临阵磨枪,加上今天总共在剑指offer上刷了十几道题吧。
晚上参加华为的机试,2个小时3个题。最后一个是图的,直接放弃了,还没复习到。
成绩上第一个题通过了90%的用例,另外的10%实在没测出来,考试模式也不会给你看什么用例没有通过,只有比例。
第二题只过了30%,后来想出来第二题的问题所在了,遗憾的是时间到了。
前两个都是字符串处理的,难度怎么说呢,过程比较复杂,需要花点时间。
另外今晚的题有点很坑的地方在于要自己控制输入输出,我在第二题时忘了getline是怎么用的了,大概耽误了十几分钟才试出来,有点遗憾。
第一题:
输入一串字符,没有空格,字符数量小于8.
求这些字符可以组成多少种不同的字符串排列。
我的求解:
#include<string>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<char> input_data = { 'a', 'b', 'a', 'c'};
string tmp;
int num[256] = { 0 };
char c;
/*while (cin >> c)
input_data.push_back(c);*/
if (input_data.size() == 0) {
cout << 0;
return 0;
}
// 统计重复字符的数量
for (auto iter = input_data.begin(); iter != input_data.end(); iter++)
{
if (tmp.find(*iter) == string::npos) {
tmp += *iter;
num[*iter]++;
}
else
num[*iter]++;
}
// 排列组合的分子项
int res1 = 1, tmp1 = input_data.size();
while (tmp1 > 0)
{
res1 *= tmp1;
tmp1--;
}
// 排列组合的分母项
int res2 = 1;
for (auto iter = tmp.begin(); iter != tmp.end(); iter++)
{
while (num[*iter] > 0) {
res2 *= num[*iter];
num[*iter]--;
}
}
cout << res1 / res2 << endl;
system("pause");
return 0;
}
感觉还可以再优化一下,res2 的值可以在统计阶段就算出来。
for (auto iter = input_data.begin(); iter != input_data.end(); iter++)
{
if (tmp.find(*iter) == string::npos) {
tmp += *iter;
num[*iter]++;
}
else
{
num[*iter]++;
res2 *= num[*iter];
}
}
第二题:
第一行输入一串字符,无空格。第二行输入一个数k,k小于字符串长度。从字符串中删除k个字符使字典序最小。
这个题明天再写,现在脑壳有些痛,要睡觉了。
网友评论