快手2020测试类笔试题A卷

1. 规律字符串输出

1 => A
2 => ABA
3 => ABACABA
以此类推
根据题目要求输出,要注意的点是输入有误时的处理

2. 压缩字符串还原

ab2c4 => abbcccc
可能坑点:1. 题目中只说了字母,可能包括小写字母和大写字母 2. 数字的位数可能大于2位

3. 输出符合特定要求的元素所在下标

[1, 2, 3] => -1 (不存在)
[100, 99, 99, 98] => 1, 2
[10, 20, 9, 11] => 3
题目要求输出满足以下条件的元素下标
1. 该元素之前的元素中只有一个比它大,重复元素按重复次数计算
可能坑点:只记录最大元素及其次数是不行的,还需要记录第二大的元素,以此判断是否符合上面的条件

4. 模拟:计算并按照规则排序输出靓号

大致题意,11位手机号,可以分为靓号和非靓号,其中靓号包括顺子,如***123*****,和豹子,如***1111****,均是三位及以上才被考虑
可能坑点:排序略繁琐,细节较多,需细心;靓号规则细节较多,如顺子有递增递减两种,顺子和豹子只考虑3-11位,同等长度豹子比顺子价值更大,连续出现3位以上才被归为顺子和豹子,同时出现顺子和豹子取连续位数更长的那个计算等等
参考代码(C++):
#include <bits/stdc++.h>

using namespace std;

class Solution {
    struct Phone { // 号码类,存储靓号及其价值
        string number; // 手机号
        bool isShunZi; // true:是顺子,false:是豹子
        int cnt; // 连续位数
        int i; // 输入顺序的下标
        Phone(string _number, bool _isShunZi, int _cnt, int _i) {
            number = move(_number);
            isShunZi = _isShunZi;
            cnt = _cnt;
            i = _i;
        }
        bool operator<(const Phone &r) { // 按题意中的优先级写排序
            if (cnt > r.cnt) {
                return true;
            } else if (cnt < r.cnt) {
                return false;
            }
            if (!isShunZi && r.isShunZi) {
                return true;
            } else if (isShunZi && !r.isShunZi) {
                return false;
            }
            return i < r.i;
        }
    };
    vector<string> v; // 所有电话号码
    void input() {
        string s;
        cin >> s;
        int l = s.size();
        for (int i = 0; i < l; i += 12) {
            v.push_back(s.substr(i, 11));
        }
    }
    Phone cal(string s, int index) { // 计算豹子、顺子、连续位数等价值信息
        int shunzi = 0; // 不知道顺子的英文是啥,只好写成拼音,下同
        for (int i = 3; i < 9; ++i) {
            char ch = s[i];
            int j = i;
            int cnt = 1;
            while (i < 11 && s[i + 1] == ch + (i + 1 - j)) { // 递增判断,如123
                ++i;
                ++cnt;
            }
            shunzi = max(shunzi, cnt);
        }
        for (int i = 3; i < 9; ++i) {
            char ch = s[i];
            int j = i;
            int cnt = 1;
            while (i < 11 && s[i + 1] == ch - (i + 1 - j)) { // 递减判断,如321
                ++i;
                ++cnt;
            }
            shunzi = max(shunzi, cnt);
        }
        int baozi = 0;
        for (int i = 3; i < 9; ++i) {
            char ch = s[i];
            int cnt = 1;
            while (i < 11 && ch == s[i + 1]) { // 连续判断,如111
                ++i;
                ++cnt;
            }
            baozi = max(baozi, cnt);
        }
        bool isShunZi = shunzi > baozi; // 因为同等长度豹子的价值更大,所以这里用<而不是<=
        return Phone(move(s), isShunZi, max(shunzi, baozi), index);
    }
    vector<Phone> filter() {
        vector<Phone> res; // 符合靓号要求的电话号码
        for (int i = 0; i < v.size(); ++i) {
          Phone tmp = move(cal(v[i], i));
          if (tmp.cnt >= 3) {
              res.emplace_back(tmp);
          }
        }
        sort(res.begin(), res.end());
        return res;
    }
    void print(const vector<Phone> &ans) {
        if (ans.empty()) {
            cout << "null" << endl;
            return;
        }
        bool flag = false;
        for (const Phone &tmp : ans) {
            if (flag) cout << ","; else flag = true;
            cout << tmp.number;
        }
        cout << endl;
    }
public:
    Solution() {
        input();
        print(filter());
    }
};

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    Solution solution = Solution();
    return 0;
}

PS:可能坑点就是可能是坑点的坑点,因为笔试中我是按自己对题目的理解写的,不保证评测数据一定包括这些坑点。欢迎牛友补充
#快手春招##快手##笔试题目##测试工程师#
全部评论
第一题是怎么不内存溢出呢?输出字符串的长度应该等于  2^n - 1吧?
点赞 回复 分享
发布于 2020-03-22 23:08
安利一下第四题(工程类A卷第三题)的更简单的做法 https://www.nowcoder.com/discuss/388841
点赞 回复 分享
发布于 2020-03-22 22:46
大佬是4A吗
点赞 回复 分享
发布于 2020-03-22 22:42

相关推荐

牛客10001:G了+1,被前端/客户端给捞起来了,不太想面
投递美团等公司7个岗位 美团求职进展汇总
点赞 评论 收藏
分享
评论
2
11
分享

创作者周榜

更多
牛客网
牛客企业服务