实习机试-华为

2020-04-29  本文已影响0人  Incredibles

昨晚收到面试邀请后就开始临阵磨枪,加上今天总共在剑指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个字符使字典序最小。
这个题明天再写,现在脑壳有些痛,要睡觉了。

上一篇下一篇

猜你喜欢

热点阅读