9.15 蚂蚁笔试编程题题解

1. 给定一个操作次数n,输出一个字符串,满足刚好这么多次操作可以使字符串中所有字母变换成全是'a'。
    对于每次操作,你可以将字母变为两个字典序中更小的字符。
    如给定n=5,输出ca。经过一次操作变为bba,再经过两次操作变为baaa,再经过两次操作变为aaaaa.
#include <bits/stdc++.h>
using namespace std;
int main() {
    int n; cin >> n;
    string ans;
    while (n) {
        int t = n&-n;
        int i = 0;
        while (!(t&(1<<i))) i++;
        ans += 'a'+i;
        n &= n-1;
    }
    reverse(ans.begin(), ans.end());
    cout << ans << endl;
    return 0;
}
2. 给你一棵树,每棵树上的节点有一个节点编号1~n,每个节点有一个初始值 1. 其中编号为1的节点为根节点。
   对于每次操作,你可以将某棵子树上的所有节点的值都加1, 求最少需要操作多少次可以使所有节点的值等于其编号。
   第一行输入一个节点总数n。
   接下来 n-1 行,每一行两个整数u, v,表示 u 和 v 中有一条边。
  示例:
    输入:3
              1 2
              1 3
    输出:
             3

   这题有个坑,如果没有满足题意的操作要输出-1,但是题目没说。
   我当时考虑到了,我以为题目没说就默认都有合法解,最后死活只通过90%。下边的题解加上了。
  // 思路:DFS
#include <bits/stdc++.h>
using namespace std;
int main() {
    int n; cin >> n;
    vector<vector<int>> son(n+1);
    for (int i = 0; i < n-1; i++) {
        int u, v; cin >> u >> v;
        if (u > v) swap(u, v);
        son[u].push_back(v);
    }

    long long ans = 0;
    function<void(int, int)> dfs =  [&] (int node, int val) {
        if (node > val) {
            cout << -1 << endl;
            return 0;
        }
        ans += node-val;
        for (auto s: son[node]) {
            dfs(s, node);
        }
    };
    dfs(1, 1);
    cout << ans << endl;
    return 0;
}
3.     给定一个只包含小写字母的字符串,求满足以下条件的子串数:
        子串中只有一个字符出现奇数次,其他字符都出现偶数次。
    实例: ababa
    输出9,满足条件的长度为1、3、5的子串分别为 5,3,1个。
 
     思路:前缀和+位运算
#include <bits/stdc++.h>
using namespace std;
int main(){
    string s;  cin >> s;
    unordered_map<int, int> cnt; 
    cnt[0] = 1;

    int n = s.length();
    int res = 0;
    int ans = 0;
    for(int i = 0; i < n; ++i){
        res ^= 1<<(s[i]-'a');
        for (int j = 0; j < 26; ++j){
            int mask = res^(1<<j);
            if (cnt.count(mask)) {
                ans += cnt[mask];
            }
        }
        cnt[res]++;
    }
    cout << ans << endl;
    return 0;
}


#蚂蚁笔试##蚂蚁2023秋招笔试凉了啊#
全部评论
第二题也没说u和v之间的大小关系,给整吐了,题目出的真不严谨
1 回复 分享
发布于 2022-09-16 15:35 北京
第一题为什么c变bb是一次操作,b变aa又是两次操作
点赞 回复 分享
发布于 2022-09-21 23:24 浙江

相关推荐

不愿透露姓名的神秘牛友
05-29 22:21
Offer1:小马智行,深圳,测试开发工程师,17.0k*16.0,Offer2:追觅科技,深圳,嵌入式工程师,18.0k*15.0,
嵌软狗都不学:各位base深圳的同事,作为也是并肩作战的一员,今天想站在管理视角,和大家开诚布公地聊一聊:从近几个月的上下班数据对比看来,我们发现一个明显的差异:深圳同事的在岗时间普遍比苏州同事短。很多深圳同事早上9点之后才到公司,晚上不到 20 点就下班了;而总部那边,20点半甚至 22 点后还有不少同事在办公室忙碌,特别是研发团队,加班更是常态。相信去过苏州的同事,对这种场景都不陌生。我很好奇,这是因为苏州工作任务太重还是咱们深圳同事效率真的高到能在更短时间内完成工作?MOVA在深圳成立分公司是为了吸引更优秀的人才贡献更多更高质的价值,公司管理层给我反馈的是深圳招到的多是行业的专家大拿,大部分都是薪资比苏州高的,而且我们办公的租金等也远高于苏州的..MOVA虽脱胎于强壮的集团母体不久,各业务板块尚未实现全面盈利,虽说公司管理层目光长远,不纠结当下的人才投入,但行业内的普遍标准是,员工创造的价值要达到公司雇佣成本的 15 倍以上。大家不妨自我审视一下,自己是否达到了这个标准?如果是抱着划水、按时打卡走人拿毛爷爷的心态那不适合来MOVA,那样过下去不但自己过得尴尬也会影响MOVA这个大船的攻城略地的速度.我并非鼓励大家盲目加班,而是倡导高效工作,拒绝无效忙碌,不要让项目进度因低效受影响,也别把精力浪费在和苏州同事拼打卡时长上,提倡更高的人效比;考虑到两地地域和交通差异,相信大家会找最适合自己发挥的工作方式(比如按时下班后1小时到家晚饭后继续未竟工作等..)大家在遵守公司规章的情况下尽情地体现自己的能力价值,为MOV!和深圳公司争光我们在这边才能更安心更有信心的工作下去;请客BU长、名部门长、项目管理和各业务单元负责人,全面梳理团队情况,及时评估成员工作负荷与成果质量,坚决清退划水害虫痕疫,践行公司价值观,相互监督,防止管理漏洞及渎职。感谢人家的理解,也请人家多担待我的直言不讳……
点赞 评论 收藏
分享
AI牛可乐:哇塞,恭喜恭喜!48万的年薪,真是让人羡慕呀!看来你找到了一个超棒的工作,可以享受不卷的生活啦!🎉有没有什么求职秘诀想要分享给小牛牛呢?或者,想不想知道我是谁呢?😉(点击我的头像,我们可以私信聊聊哦~)
点赞 评论 收藏
分享
评论
16
39
分享

创作者周榜

更多
牛客网
牛客企业服务