作业帮25暑期实习笔试

一个字符串,一个思维,一个树状数组。

  1. 解析http的GET请求,输入一个http的url以及一个key,中间用空格隔开。输入key对应的value

Input:

https://www.baidu.com?id=123&age=18 id

Output:

123

Code:

#include <bits/stdc++.h>

using namespace std;

int main() {
    string s, t;
    bool f = false;
    cin >> s >> t;
    unordered_map<string, string> mp;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] == '?') {
            f = true; continue;
        }
        if (!f) continue;
        int j = i;
        while (j < s.size() && s[j] != '=') j++;
        string key = s.substr(i, j - i);
        i = j;
        while (i < s.size() && s[i] != '&') i++;
        string val = s.substr(j + 1, i - j - 1);
        mp[key] = val;
    }
    cout << mp[t];
    return 0;
}
  1. 给一个数组,求数组中任意三个数乘积的最大值。 Input:
1,2,-5,-6,-2,4,3

Output:

120

Code:

#include <bits/stdc++.h>

using namespace std;

int main() {
    string s;
    cin >> s;
    vector<int> nums;
    nums.clear();
    int i = 0, base = 0, t = 1;
    while (i < s.size() && s[i] != ',') {
        if (s[i] == '-') t = -1;
        else base = base * 10 + s[i] - '0';
        ++i;
    }
    nums.push_back(base * t);
    for (; i < s.size(); ++i) {
        while (i < s.size() && s[i] != ',') {
            if (s[i] == '-') t = -1;
            else base = base * 10 + s[i] - '0';
            ++i;
        }
        nums.push_back(base * t);
        base = 0;
        t = 1;
    }
    sort(nums.begin(), nums.end());
    vector<int> ban;
    ban.clear();
    if (nums.size() <= 6) ban = nums;
    else {
        for (int i = 0; i < 3; ++i) ban.push_back(nums[i]);
        for (int i = nums.size() - 3; i < nums.size(); ++i) ban.push_back(nums[i]);
    }
    int ans = -0x3f3f3f3f;
    for (int i = 0; i < ban.size(); ++i) 
        for (int j = i + 1; j < ban.size(); ++j)
            for (int k = j + 1; k < ban.size(); ++k) {
                int x = ban[i], y = ban[j], z = ban[k];
                ans = max(ans, x * y * z);  
            }
    cout << ans;
    return 0;
}
  1. 给一个长度为n的整型数组a[i] (1 <= i <= n)表示颜色,由该数组拓展为一个无限长的彩带a,其中a[i]=a[i-n] (i>n)a[i]表示该彩带在位置i的颜色。
  • 现在给q个操作,每个操作由一个字符c以及一个整数x组成。其中字符c'L''R',如果c='L'那么表示从左向右剪该彩带,如果c='R'那么表示从右向左剪该彩带。x表示剪下的长度。
  • 求剪下的彩带里不同颜色的个数。
  • 输入第一行nq,第二行n个数表示a[i],接下来q行,每行一个cx
  • n, q <= 2e5

Input:

6 3
1 1 4 5 1 4
L 2
L 3
R 12

Output:

1
3
3

Hint:

初始彩带为:1 1 4 5 1 4 1 1 4 5 1 4 1 1 4 5 1 4 ... 1 1 4 5 1 4
第一次从左往右剪长度为 2,剪下的彩带为:1 1,其中不同的颜色有1个。
这时彩带为:4 5 1 4 1 1 4 5 1 4 1 1 4 5 1 4 ... 1 1 4 5 1 4
第二次从左往右剪长度为 3,剪下的彩带为:4 5 1,其中不同的颜色3个。
这时彩带为:4 1 1 4 5 1 4 1 1 4 5 1 4 ... 1 1 4 5 1 4
第三次从右往左剪长度为 12,剪下的彩带为:1 1 4 5 1 4 1 1 4 5 1 4,其中不同的颜色有3个。
这时彩带为:4 1 1 4 5 1 4 1 1 4 5 1 4 ... 1 1 4 5 1 4

Code:

#include <bits/stdc++.h>

using namespace std;

const int N = 4e5 + 10;

int n, q, a[N], mx;
int tr[N], ans[N];

struct node {
    int l, r, id;
    bool f;
    bool operator<(const node &t) const {
        return r < t.r; 
    }
}op[N];

int lt(int x) {
    return x & -x;
}

void add(int x, int v) {
    for (int i = x; i <= n; i += lt(i)) tr[i] += v; 
}

int query(int x) {
    int res = 0;
    for (int i = x; i; i -= lt(i)) res += tr[i];
    return res; 
}

int main() {
    scanf("%d%d", &n, &q);
    unordered_map<int, bool> st;
    for (int i = 1; i <= n; ++i) {
        scanf("%d", a + i);
        if (!st[a[i]]) {
            st[a[i]] = 1;
            ++mx;
        }
    }
    for (int i = n + 1; i <= 2 * n; ++i) a[i] = a[i - n];
    int L = 1, R = 2 * n;
    for (int i = 1; i <= q; ++i) {
        char c; int x, l, r;
        getchar();
        scanf("%c%d", &c, &x);
        op[i].id = i;
        if (x >= n) op[i].f = 1;
        else op[i].f = 0;
        x %= n;
        if (c == 'L') {
            l = L, r = L + x - 1;
            L = r + 1; if (L > n) L -= n;
        }
        else {
            l = R - x + 1, r = R;
            R = l - 1; if (R <= n) R += n;
        }
        op[i].l = l, op[i].r = r;
    }
    sort(op + 1, op + 1 + q);
    unordered_map<int, int> pre;
    int pos = 0;
    for (int i = 1; i <= q; ++i) {
        int l = op[i].l, r = op[i].r, id = op[i].id;
        if (op[i].f) ans[id] = mx;
        else {
            while (pos < r) {
                ++pos;
                if (pre[a[pos]]) add(pre[a[pos]], -1);
                add(pos, 1);
                pre[a[pos]] = pos;
            }
            ans[id] = query(r) - query(l - 1);
        }
    }
    for (int i = 1; i <= q; ++i) printf("%d\n", ans[i]);
    return 0;
}
#作业帮笔试#
全部评论
你这是臭带罢
2 回复 分享
发布于 03-21 19:52 湖北
第二题好臭
点赞 回复 分享
发布于 04-15 16:49 陕西
C题代码是正确的?
点赞 回复 分享
发布于 04-10 22:55 山东

相关推荐

06-16 00:51
已编辑
清华大学 后端
1,首先自我介绍,问我为什么选go(我想着反正后端,写什么语言不重要)我了解过过他们的公司业务,主要做ai的,因为我原本也不是写后端的,就回答说go主流去做ai相关的后端应用。面试官就说,python不是更适合做ai吗?比如机器学习,深度学习?但我知道python有人工智能相关库,这问题就这样过了---2,之后面试直接上算法,让我用我最熟悉的语言写,我想着我都投递go了,我就直接用go写,一道比较简单的有序数组合并,刚好会(写完后,面试官问我时间复杂度是多少,我说m+n,他一脸疑惑,我说了几遍,他好像听不太懂,怀疑跟他那边嘈杂的环境有关),之后问我用了多少测试cases,不是,哥们,你不是看得到我屏幕吗?这是人能问出来的问题,我甚至怀疑要开始怀疑面试官是不是连时间复杂度都不会算了---3,问了mysql,写语句,10e的数据,字段有id,name,create-time....其中id为自增主键,在不建立索引的情况下,查询最近一周的量,写了一下,面试官不太满意,说没用到索引....(重点是,我一面也出了这道题,我就这么写的)---4,之后就直接反问环节,问下面试官对于刚刚的10e数据量那道题有什么想法,怎么处理才是正确的,开始巴拉巴拉,他周围太吵,没怎么听清,只听到二分这个词。之后问对这场面试的感受。面试官拒绝说这个,开始说教模式,说什么别问面试官这种问题,之后就不问say&nbsp;goodbay了---写在后头,二面的体验是很差的,感觉就是面试官仗着自己年龄大,经验丰富?秃顶?一种老人说教的感觉。无论说什么都是反驳你,而不是一起探讨的态度感想:希望公司对面试官人选重视点,普通话有浓厚的地方口音,很多时候都听不清,环境也不选安静一点的,高高在上的姿态让人十分不爽
查看6道真题和解析
点赞 评论 收藏
分享
一面052350min1.自我介绍2.在学校里的经历3.你希望测试开发岗位里的测试工作和开发工作占比是多少?4.实习拷打,详细拷打实习中做过的接口自动化项目5.为什么接口自动化项目选择pytest?6.设计测试用例会考虑哪些点?7.用过jekins的什么功能,了解过它底层的实现吗8.技术栈是?熟悉的编程语言?9.口述思路:二叉树的遍历10.手撕:二分查找11.浏览器输入url到展示页面的全流程?12.进程和线程13.死锁14.慢查询15.读过有关测试的技术书籍吗16.写测试自动化时用过python的哪些库?17.反问(作业帮直播业务,给学生直播上课之类的)&nbsp;二面052755min1.自我介绍2...
一笑而过2222:1. String和StringBuffer区别:String是不可变、线程安全(因不可变特性)的,每次操作会创建新对象,适合只读场景;StringBuffer是可变、线程安全(方法加锁)的,可直接修改对象,适用于多线程环境下频繁修改字符串的场景 。 2. Java的垃圾回收器:Java垃圾回收器是JVM自动管理内存的组件,基于分代收集理论,通过标记-清除、复制、标记-整理等算法回收不再使用的对象,常见类型有Serial、Parallel、CMS、G1等,分别适用于不同性能需求场景。 3. Java的序列化:Java序列化是将对象转换为字节序列以便存储或传输的机制,对象所属类需实现Serializable接口,反序列化可将字节流恢复为对象,常用于分布式通信、数据持久化和对象深拷贝等场景。
查看24道真题和解析
点赞 评论 收藏
分享
评论
10
61
分享

创作者周榜

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