美团嵌入式软件实习笔试编程题

《嵌入式软件开发笔试与面试手册》https://blog.nowcoder.net/zhuanlan/jvN8gj

《软件开发笔试汇总》https://blog.nowcoder.net/zhuanlan/0oDWVm

1.小美点外卖

小美是美团外卖的忠实用户,她经常去美团外卖 app 上面点外卖,因为会员红包的性价比太高啦!

现在小美点了若干道菜,她希望你计算一个订单的总价。你能帮帮她吗?

输入描述

第一行输入一个正整数n,代表菜品总数。

第二行输入n个正整数ai,代表每道菜的价格。

第三行输入两个正整数xyx代表满减的价格,y代表红包的价格。

1<=n<=10^5

1<=x,y,ai<=10^9

保证所有的和大于,保证会用到满减

输出描述

一个正整数,代表小美最终应付的钱数。

示例 1

输入

4

10 20 10 20

25 10

输出

25

说明

四个菜一共 60 元,满减减掉了 25 元,再用一个 10 元的红包,因此需要付 25 元。

#include <iostream>
using namespace std;

int main() {
    int num;
    long long sum = 0;
    cin >> num;
    for (int i = 0; i < num; i++) {
        long long temp;
        cin >> temp;
        sum += temp;
    }
    long long l1, l2;
    cin >> l1 >> l2;
    sum = sum - l1 - l2;
    cout << sum << endl;
    return 0;
}

2.小美的合法单词

小美定义以下三种单词是合法的:

  1. 所有字母都是小写。例如:good
  2. 所有字母都是大写。例如:APP
  3. 第一个字母大写,后面所有字母都是小写。例如:Alice

现在小美拿到了一个单词,她每次操作可以修改任意一个字符的大小写。小美想知道最少操作几次可以使得单词变成合法的?

输入描述

一个仅由大写字母和小写字母组成的字符串,长度不超过10^5

输出描述

一个整数,代表操作的最小次数。

示例 1

输入

AbC

输出

1

说明

变成 ABC 或者 Abc 均可。只需要一次操作。

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    string s;
    getline(cin, s);
    int small = 0, big = 0;
    int res = s.length();
    for (size_t i = 0; i < s.length(); ++i) {
        if(s[i] >= 'a' && s[i] <= 'z') small++;
        else if(s[i] >= 'A' && s[i] <= 'Z') big++;
    }
    int temp = s.length();
    if(s[0] >= 'A' && s[0] <= 'Z') temp = s.length() - 1 - small;
    res = min({small, big, temp}); // 使用min函数计算三个数中的最小值
    cout << res << endl;
    return 0;
}

3、翻倍元素

小美拿到了一个数组,她每次操作会将除了第x个元素的其余元素翻倍,一共操作了q次。请你帮小美计算操作结束后所有元素之和。

由于答案过大,请对10^9+7取模。

输入描述

第一行输入两个正整数n,q,代表数组的大小和操作次数。 第二行输入n个正整数ai,代表数组的元素。 第三行输入一个正整数q,代表操作的次数。 接下来的q行,每行输入一个正整数xi,代表第i次操作未被翻倍的元素。 1<=n,q<=10^5 1<=xi<=n 1<=ai<=10^9

输出描述

一个整数,代表操作结束后所有元素之和模10^9+7的值。

示例

输入

4 2 1 2 3 4 1 2

输出

34

说明

第一次操作后,数组变成[1,4,6,8] 第二次操作后,数组变成[2,4,12,16] 所有元素之和为 34

#include <iostream>
#include <vector>
using namespace std;

const int MOD = 1000000007;

// 快速幂算法
long long fast_power(long long base, long long exp, long long mod) {
    long long result = 1;
    while (exp > 0) {
        if (exp % 2 == 1) {
            result = (result * base) % mod;
        }
        base = (base * base) % mod;
        exp /= 2;
    }
    return result;
}

// 主函数,解决问题
long long solve(int n, int q, vector<int>& a, vector<int>& operations) {
    // 初始化跳过计数数组
    vector<int> skip_count(n, 0);
    
    // 计算每个元素被跳过的次数
    for (int x : operations) {
        skip_count[x - 1]++; 
    }
    
    // 计算最终的和
    long long final_sum = 0;
    for (int i = 0; i < n; i++) {
        // 计算元素ai的最终乘数
        long long element_power = fast_power(2, q - skip_count[i], MOD); //计算2的幂,就是翻倍的次数
        long long final_value = (static_cast<long long>(a[i]) * element_power) % MOD;
        
        // 累加到最终和
        final_sum = (final_sum + final_value) % MOD;
    }
    
    return final_sum;
}

int main() {
    int n, q;
    cin >> n >> q;
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    vector<int> operations(q);
    for (int i = 0; i < q; i++) {
        cin >> operations[i];
    }
    
    cout << solve(n, q, a, operations) << endl;
    return 0;
}

4.小美的众数

小美拿到了一个数组。她希望你求出所有区间众数之和。你能帮帮她吗?

定义区间的众数为出现次数最多的那个数。如果有多个数出现次数最多,那么众数是其中最小的那个数。

 

输入描述

第一行输入一个正整数n,代表数组的大小。

第二行输入n个正整ai,代表数组的元素。

1<=n<=200000

1<=ai<=2

输出描述

一个正整数,代表所有区间的众数之和。

示例 1

输入

3

2 1 2

输出

9

说明

[2],[2,1,2],[2]的众数是 2[2,1],[1],[1,2]的众数是 1。因此答案是 9

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> arr(n);
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    const int MOD = 1000000007;
    long long result = 0;

    // 用于存储1和2的数量
    vector<long long> count_1(n + 1, 0), count_2(n + 1, 0);

    // 初始化前缀和数组
    for (int i = 0; i < n; i++) {
        count_1[i + 1] = count_1[i] + (arr[i] == 1);
        count_2[i + 1] = count_2[i] + (arr[i] == 2);
    }

    // 遍历所有可能的子区间
    for (int i = 0; i < n; i++) {
        for (int j = i; j < n; j++) {
            int c1 = count_1[j + 1] - count_1[i];  // 从i到j的1的数量
            int c2 = count_2[j + 1] - count_2[i];  // 从i到j的2的数量
            if (c1 > c2) {
                result += 1;
            } else if (c1 < c2) {
                result += 2;
            } else { // c1 == c2
                result += min(arr[i], arr[j]);
            }
            result %= MOD;
        }
    }

    cout << result << endl;
    return 0;
}

#软件开发2024笔面经#

本专栏主要发布2024年嵌入式软件开发相关岗位笔试真题(嵌入式软件开发、通用软件开发、C/C++软件开发、算法工程师、测试开发等)主要是算法编程题,其中一些岗位笔试含有对应的选择题、填空题、简单题。

全部评论
mark
点赞 回复
分享
发布于 04-21 11:50 广东
感谢分享
点赞 回复
分享
发布于 04-22 19:14 广东
滴滴
校招火热招聘中
官网直投

相关推荐

1.嵌入式从技术来分,分为有操作系统和没操作系统的,有操作系统的是未来的主流。2.嵌入式从职业上分为:一.嵌入式硬件u工程师二.嵌入式驱动工程师三.嵌入式软件工程师四.嵌入式系统工程师嵌入式硬件工程师是最最底层的,通常要接触很多设备,同时还要精通电路图,和电路的设计。说的通俗一点,硬件工程师,把这个项目的各个设备把线给连起来,方便后面的程序编写。嵌入式驱动工程师,就是写这些设备的驱动,你硬件工程师把线连起来了,你得编程吧,你就负责驱动这些设备的程序吧。有些项目,需要在操作系统上驱动设备,那你就要会用这个操作系统,在操作系统上,驱动这些设备,其实大多是都是靠移植。嵌入式软件工程师,非常精通C语言,如果在操作系统上,还得精通数据结构和操作系统,也得会一些常用的算法,有点类似于,让你在安卓或者IOS系统下做一个APP。小编对于嵌入式软件了解的不是很多,有讲错的地方请指出。嵌入式系统工程师,这个如果你很厉害,会写操作系统,那你工资是很高的,但也得付出很多的精力去学习。一般情况下我们都是靠移植,毕竟咋没有华为,苹果,谷歌的实力啊。一般在大公司才会分的这么细,大公司做一个项目,每个人需要干什么会分的很细很细的。举个例子,你们公司要做一个扫地机器人,那么你或者你们这些人组成一个团队,负责扫地机器人的电机驱动的板级支持包编写。那你或者你们这个团队就是负责嵌入式驱动。如果你在小公司,那就说不准了,老板肯定想你会的更多,这样子就不要招更多的人了,但小公司往往工资不比大公司少,毕竟能者多劳,但累确实挺累的。如果读者们还是不清楚嵌入式是什么,或者说嵌入式想学什么,那么小编建议大家学习嵌入式先看一些数电模电,电子专业的书籍,有了一定基础之后,买一块51单片机开发板,从最简单的裸机开始学习,会是一个不错的选择,51单片机学的差不多了,做一个小项目。难一点的基于51单片机的蓝牙指纹开锁系统,简单一点的做一个基于51单片机温度控制系统。51都会了。在买一个32位的学习板,这个跟51比起来,要全部学会还是有点难度的,学的差不多了也可以考虑做一些项目,这个关于嵌入式的学习方向,我以后还会专门写一篇文章来介绍的。&nbsp;&nbsp;c++/嵌入式面经专栏-牛客网 https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM
点赞 评论 收藏
转发
7 28 评论
分享
牛客网
牛客企业服务