米哈游笔试前端9.14 AC C++

一个身高序列,排队,相邻两人身高平均数不是整数的,越多越好,输出最终队列

两种思路:

① 奇、偶身高分别一个栈,然后交替出栈入队,最后剩下的全入队。注意,因为每个人对左右都能产生共献,所以要人数多的先入队,比如【偶,奇,偶】

用到了O(N)的额外空间

#include <bits/stdc++.h>
using namespace std;

const size_t MAX_N = 100002;
uint a[MAX_N];

int main() {
    int n;
    cin >> n;
    stack<uint> odd, even;
    for(int i = 0; i < n; i++) {
        cin >> a[i];
        if(a[i] & 1) odd.push(a[i]);
        else even.push(a[i]);
    }

    vector<uint> order;
    while(odd.size() && even.size()) {
        if(odd.size() > even.size()) {
            order.push_back(odd.top());
            order.push_back(even.top());
        }
        else {
            order.push_back(even.top());
            order.push_back(odd.top());
        }
        odd.pop();
        even.pop();
    }

    while(odd.size()) {
        order.push_back(odd.top());
        odd.pop();
    }

    while(even.size()) {
        order.push_back(even.top());
        even.pop();
    }

    for(int i = 0; i < order.size(); i++)
        cout << order[i] << (i == order.size() - 1 ? "\n" : " ");
    return 0;
}

② 基本思路同上,但是奇偶各一个链表,少的往多的里面插,变成经典的合并链表,O(1)空间复杂度

代码略

给定字符串,查找存在连续k个"mihoyo"的最短字串,不存在输出-1,存在输出起始、末尾下标

基本思路:找到所有模式串的下标,保存到一个数组,然后按左右下标间隔k,遍历下标数组,计算最短长度

#include <bits/stdc++.h>
using namespace std;

const string TARGET = "mihoyo";
const size_t TARGET_LEN = TARGET.size();

int main() {
    int n, k;
    cin >> n >> k;
    string str;
    cin >> str;
    vector<size_t> mihoyoPosition;
    size_t p = -1;
    // 全部出现位置
    while((p = str.find(TARGET, p + 1)) != string::npos) mihoyoPosition.push_back(p);
    // 不足k个
    if(mihoyoPosition.size() < k) {
        cout << "-1\n";
        return 0;
    }
    // 找结果
    pair<int, int> answer;
    size_t minLength = UINT_MAX;
    int l = 0, r = k - 1;
    while(r < mihoyoPosition.size()) {
        size_t len = mihoyoPosition[r] - mihoyoPosition[l];
        if(len < minLength) {
            minLength = len;
            answer = {mihoyoPosition[l], mihoyoPosition[r] + TARGET_LEN - 1};
        }
        ++l, ++r;
    }
    cout << answer.first << ' ' << answer.second << '\n';
    return 0;
}

一个序列,每一次操作可以使一个数翻倍,使得序列成为严格递增的最少操作次数

计算每一个元素,严格大于前一个数需要翻倍的次数
的下一个数
对于,可以解出
再考虑对于每一个数被翻倍后,后面的数理应同等地一起进行翻倍(或者说,需要先翻完前一个数翻倍的次数,再去做“为了大于前一个数而进行的翻倍”)
因此将每一个数需要的存到一个数组里,然后计算前缀和,最后再求和
仔细考虑特殊情况:
,即已经满足了严格递增,解出的会是0或负数,负数实际有意义,说明前缀和累加到自己的时候,可以少翻几次。但是前缀和始终应当非负。
恰好差了2的幂次倍数,为了“严格递增”,需要加一
代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const size_t MAX_N = 100002;
int a[MAX_N], mark[MAX_N]; /* 记录每个数的k(大于前一个数需要翻倍的次数) */

int main() {
    size_t n;
    cin >> n;
    for(int i = 0; i < n; i++) cin >> a[i];

    for(int i = 1; i < n; i++) {
        int k = int(ceil(log2(a[i - 1]) - log2(a[i])));
        // 如果前后两个正好差2^t倍,多乘一个2(为了严格递增)
        double t = log2(a[i - 1] * 1.0 / a[i]);
        mark[i] = abs(ceil(t) - floor(t)) <= 1E-6 ? k + 1 : k;
    }
    LL ans = 0, sum = 0;
    for(int i = 1; i < n; i++) {
        sum = sum + mark[i];
        if(sum < 0) sum = 0;
        ans += sum;
    }
    cout << ans << '\n';
    return 0;
}
#笔试题目##米哈游笔试##米哈游秋招##米哈游23秋招笔试心得体会#
全部评论
学长过了吗
点赞 回复 分享
发布于 2023-06-10 23:51 浙江
hi~同学,秋招遇“寒气”,牛客送温暖啦!23届秋招笔面经有奖征集中,参与就得牛客会员7天免费体验,最高赢300元京东卡!戳我去看>>>https://www.nowcoder.com/link/zhengjipinglun
点赞 回复 分享
发布于 2022-09-16 12:42 北京

相关推荐

上周组里招人,我面了六个候选人,回来跟同事吃饭的时候聊起一个让我挺感慨的现象。前三个候选人,算法题写得都不错。第一道二分查找,五分钟之内给出解法,边界条件也处理得干净。第二道动态规划,状态转移方程写对了,空间复杂度也优化了一版。我翻他们的简历,力扣刷题量都在300以上。后三个呢,就有点参差不齐了。有的边界条件没处理好,有的直接说这道题没刷过能不能换个思路讲讲。其中有一个女生,我印象特别深——她拿到题之后没有马上写,而是先问我:“面试官,我能先跟你确认一下我对题目的理解吗?”然后她把自己的思路讲了一遍,虽然最后代码写得不是最优解,但整个沟通过程非常顺畅。这个女生的代码不是最优的,但当我问她“如果这里是线上环境,你会怎么设计’的时候,她给我讲了一套完整的方案——异常怎么处理、日志怎么打、怎么平滑发布。她对这是之前在实习的时候踩过的坑。”我在想LeetCode到底在筛选什么?我自己的经历可能有点代表性。我当年校招的时候,也是刷了三百多道题才敢去面试。那时候大家都刷,你不刷就过不了笔试关。后来工作了,前三年基本没再打开过力扣。真正干活的时候,没人让你写反转链表,也没人让你手撕红黑树。更多的是:这个接口为什么慢了、那个服务为什么OOM了、线上数据对不上了得排查一下。所以后来我当面试官,慢慢调整了自己的评判标准。算法题我还会出,但目的变了。我出算法题,不是想看你能不能背出最优解。而是想看你拿到一个陌生问题的时候,是怎么思考的。你会先理清题意吗?你会主动问边界条件吗?你想不出来的时候会怎么办?你写出来的代码,变量命名乱不乱、结构清不清楚?这些才是工作中真正用得到的能力。LeetCode是一个工具,不是目的。它帮你熟悉数据结构和常见算法思路,这没问题。但如果你刷了三百道题,却说不清楚自己的项目解决了什么问题、遇到了什么困难、你是怎么解决的,那这三百道题可能真的白刷了。所以还要不要刷LeetCode?要刷,但别只刷题。刷题的时候,多问自己几个为什么:为什么用这个数据结构?为什么这个解法比那个好?如果换个条件,解法还成立吗?把刷题当成锻炼思维的方式,而不是背答案的任务。毕竟面试官想看到的,从来不是一台背题机器,而是一个能解决问题的人。
牛客51274894...:意思是光刷力扣还不够卷
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
3
16
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务