拼多多笔试 拼多多软件算法笔试5-15

订阅专栏,方便查阅,时刻更新各厂软件算法笔试https://blog.nowcoder.net/zhuanlan/0oDWVm

题目1:多多的商品编号

多多君接到了一个给活动商品编号的任务:每次可选的商品编号区间是[L,R]。由于活动的日期定在0520号,多多君认为包含520520的编号是有特殊含义,准备保留给对应的商品。例如:618520,其中包含了520,是一个特殊编号;12368就是一个普通编号。多多君想知道,在可选的商品编号区间内,有多少符合上面要求的特殊编号。

 

输入描述

第一行,1个整数T,表示每次可选的编码区间。( 1 <=T<= 1,000 ) 接下来T行,每行2个整数:LR,表示编码可选的区间(闭区间,即包括LR)( 1<=L<=R<= 1,000,000 )

输出描述

T行,每行3个整数,分别表示对应区间里的520520的编号数量

 

示例1

输入

3

1 20

100 1000

520 5200

输出

2 1 0

252 19 1

1441 187 6

说明

对于第一组可选编号区间:[1,20],符合要求的特殊编号包括:

{ 5,15,20},其中包括5的有2个,201个,5200个。

对于第三组可选编号区间:[520,5200],包含520的特殊编号包括:

{ 52015202520352045205200 },共6个。

#include <iostream>
#include <vector>
#include <string>

using namespace std;

const int mxn = 1e6;

vector<int> pre5(mxn + 1, 0), pre20(mxn + 1, 0), pre520(mxn + 1, 0);

int main() {
    for (int i = 1; i <= 1e6; ++i) {
        pre5[i] = pre5[i - 1];
        pre20[i] = pre20[i - 1];
        pre520[i] = pre520[i - 1];

        string s = to_string(i);

        if (s.find('5') != string::npos)
            pre5[i]++;

        if (s.find("20") != string::npos)
            pre20[i]++;

        if (s.find("520") != string::npos)
            pre520[i]++;
    }

    int T;
    cin >> T;
    for (int t = 0; t < T; ++t) {
        int L, R;
        cin >> L >> R;

        cout << pre5[R] - pre5[L - 1] << " ";
        cout << pre20[R] - pre20[L - 1] << " ";
        cout << pre520[R] - pre520[L - 1] << "\n";
    }

    return 0;
}

题目2:多多的植树计划IV

多多君在多多农场的某块林地上种了N颗树苗((编号1~N),其中第i颗树有健康度Hi。多多君计划给树苗们浇水,每次给某棵树苗浇水可以使其健康度上升A;同时由于水的流动,其他树苗的健康度都会上升B(其中A大于等于B)。为了每棵树苗都能够顺利成长,多多君希望所有树苗的健康度都大于或等于M。多多君想知道,在达到这个目标的前提下,最少的浇水次数是多少。

 

输入描述

第一行,4个整数NMAB,分别表示农场中树苗的数量、目标达到的健康度、直接浇水增加的健康度和间接浇水增加的健康度。( 1 <= N,M,A,B<= 1,000,000A >=B) 接下来N行,每行1个整数Hi,分别表示第i棵树苗初始的健康度Hi(0<= Hi <= 1,000,000 )

输出描述

共一行,1个整数,表示最少的浇水次数使得所有树苗都能达到目标的健康度。

 

示例1

输入

4 10 5 3

2

3

6

8

输入

2

说明

两次浇水:

第一次浇水选择第1号树苗,树苗们的健康度变为:{769,11}

第二次浇水选择第2号树苗,树苗们的健康度变为:{ 10,1112,14 }

满足所有树苗的健康度都大于或等于10

示例2

输入

3 20 10 5

10

5

0

输出

3

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

int N, M, A, B;
vector<int> healths;

bool check(int x) {
    priority_queue<int, vector<int>, greater<int>> nums(healths.begin(), healths.end());
    int target = M;
    for (int i = 0; i < x; ++i) {
        int minn = nums.top();
        nums.pop();
        nums.push(minn + A - B);
        target -= B;
    }
    return nums.top() >= target;
}

int main() {
    cin >> N >> M >> A >> B;
    healths.resize(N);
    for (int i = 0; i < N; ++i) {
        cin >> healths[i];
    }

    sort(healths.begin(), healths.end());

    int l = 0, r = 1e6;
    while (l < r) {
        int mid = (l + r) / 2;
        if (check(mid)) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }

    cout << r << endl;

    return 0;
}

题目3:多多的字符翻转

多多君在研究十六进制字符串的翻转关系,每次可以选择字符串中的某个子串,进行一次整体变大或变小的翻转。例如: "ABCD"选择中间2个字符的子串"BC",变大翻转会变成: "ACDD",变小翻转会变成:"AABD"。特别的,字符0'变小的翻转会变成字符F',同理字符'F'的变大翻转会变成字符0',以此ABAB

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

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

全部评论

相关推荐

最近群里有很多同学找我看简历,问问题,主要就是集中在明年三月份的暑期,我暑期还能进大厂嘛?我接下来该怎么做?对于我来说,我对于双非找实习的一个暴论就是title永远大于业务,你在大厂随随便便做点慢SQL治理加个索引,可能就能影响几千人,在小厂你从零到一搭建的系统可能只有几十个人在使用,量级是不一样的。对双非来说,最难的就是约面,怎么才能被大厂约面试?首先这需要一点运气,另外你也需要好的实习带给你的背书。有很多双非的同学在一些外包小厂待了四五个月,这样的产出有什么用呢?工厂的可视化大屏业务很广泛?产出无疑是重要的,但是得当你的实习公司到了一定的档次之后,比如你想走后端,那么中厂后端和大厂测开的选择,你可以选择中厂后端(注意,这里的中厂也得是一些人都知道的,比如哈啰,得物,b站之类,不是说人数超过500就叫中厂),只有这个时候你再去好好关注你的产出,要不就无脑大厂就完了。很多双非同学的误区就在这里,找到一份实习之后,就认为自己达到了阶段性的任务,根本不再投递简历,也不再提升自己,玩了几个月之后,美其名曰沉淀产出,真正的好产出能有多少呢?而实际上双非同学的第一份实习大部分都是工厂外包和政府外包!根本无产出可写😡😡😡!到了最后才发现晚了,所以对双非同学来说,不要放过任何一个从小到中,从中到大的机会,你得先有好的平台与title之后再考虑你的产出!因为那样你才将将能过了HR初筛!我认识一个双非同学,从浪潮到海康,每一段都呆不久,因为他在不断的投递和提升自己,最后去了美团,这才是双非应该做的,而我相信大部分的双非同学,在找到浪潮的那一刻就再也不会看八股,写算法,也不会打开ssob了,这才是你跟别人的差距。
迷茫的大四🐶:我也这样认为,title永远第一,只有名气大,才有人愿意了解你的简历
双非本科求职如何逆袭
点赞 评论 收藏
分享
评论
2
12
分享

创作者周榜

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