蚂蚁笔试 研发岗 09.15 AC

第一题

一个字母可以拆分成两个字母表顺序的前一个字母,例如,b可以拆分成aa,c可以拆分成bb。
打印出最短的可以拆分成 K 个 a 的字符串,字母顺序无所谓。
例如,k = 5, 最短字符串为 ca(或ac) = bba = aaaaa.

K = 1, a; K = 2, b; K = 4, c;.....

    public static void main1(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        StringBuilder sb = new StringBuilder();
        int i = 0;
        while(n > 0){
            if((n&1) == 1){
                sb.append((char)('a'+i));
            }
            i++;
            n = n >> 1;
        }
        System.out.println(sb.toString());
    }

第二题

N个节点的树,根节点编号为1。
最开始,树上所有节点的值都为1。
你可以进行如下操作,选择一个子树,让子树的所有节点的值+1.
问,最少需要多少次操作才可以让每个节点的值等于其编号。

隐藏case,若进行上述操作无法使得节点值等于编号,则打印-1.

输入:
3 // 3个节点
1 3 // 1-3相连
1 2 // 1-2相连
输出:
3
// 2 节点子树,操作一次
// 3 节点子树,操作二次
    static List<List<Integer>> list;
    static boolean vis[];
    static long ret;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        vis = new boolean[n+1];
        ret = 0;
        list = new ArrayList<>();
        for(int i = 0; i <= n; i++){
            list.add(new ArrayList<>());
        }
        for(int i = 1; i < n; i++){
            int a = sc.nextInt();
            int b = sc.nextInt();
            list.get(a).add(b);
            list.get(b).add(a);
        }
        dfs(1, 1);
        System.out.println(ret);
    }

    public static void dfs(int node, int del) {
        if(node < del || ret == -1) {
            ret = -1;
            return;
        }
        ret += node - del;
        vis[node] = true;
        for(int child : list.get(node)){
            if(!vis[child]){
                dfs(child, node);
            }
        }
    }

第三题

解法:
状态压缩

    public static void main32(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();

        int n = s.length();

        int arr[]=new int[n+1];
        for(int i = 1; i <= n; i++){
            arr[i] = arr[i-1] ^ (1 << (s.charAt(i-1) - 'a'));
        }

        long ret = 0;
        int cnt[] = new int[1<<26];

        // 可以和上面的for循环合并
        for(int i = 0; i <= n; i++){
            for(int j = 0; j < 26; j++){
                int tmp = arr[i] ^ (1 << j);
                ret += cnt[tmp];
            }
            cnt[arr[i]]++;
        }

        System.out.println(ret);
    }
#蚂蚁##笔试##23届秋招笔面经#
全部评论
第一次遇到存在隐藏case这种事情。。假设输入合法去做的,0%。。
4 回复
分享
发布于 2022-09-15 20:39 广东
原来是残酷群出来的大佬,真是乱杀
1 回复
分享
发布于 2022-09-15 21:46 陕西
联易融
校招火热招聘中
官网直投
第二道隐藏case绝了!题目啥也没说,就是让别人去猜呢呗,哭死。。
5 回复
分享
发布于 2022-09-15 20:38 河北
大佬,残酷群是啥,可以进吗?我的状态压缩太弱了,得好好练练!
点赞 回复
分享
发布于 2022-09-16 10:38 广东
楼主第三题是求子串数还是子序列数?
点赞 回复
分享
发布于 2022-09-16 12:57 广东
第三题没用dp只过了20
点赞 回复
分享
发布于 2022-09-16 17:45 广东
感谢,第三题状态压缩太秒了,终于想明白了
点赞 回复
分享
发布于 2022-09-17 16:17 上海
大佬,第三题 int tmp = arr[i] ^ (1 << j); 这里不理解为啥这样做,能简单说说吗
点赞 回复
分享
发布于 2022-09-17 20:58 广东
楼主投的哪个部门啊
点赞 回复
分享
发布于 2022-09-18 19:50 江苏
太牛了
3 回复
分享
发布于 2022-09-15 20:33 广东
第二题为什么要visited,意思是这个树可以有环吗
2 回复
分享
发布于 2022-09-15 20:43 浙江
hi~同学,秋招遇“寒气”,牛客送温暖啦!23届秋招笔面经有奖征集中,参与就得牛客会员7天免费体验,最高赢300元京东卡!戳我去看>>>https://www.nowcoder.com/link/zhengjipinglun
1 回复
分享
发布于 2022-09-16 12:14 北京
玛德,我们还在辛辛苦苦笔试,有些哥们还没笔试就已经被面试了
1 回复
分享
发布于 2022-09-17 16:46 北京
感谢大佬分享!
点赞 回复
分享
发布于 2022-09-15 20:34 山东
根本不会状态压缩dp
点赞 回复
分享
发布于 2022-09-15 20:36 北京
膜拜大佬
点赞 回复
分享
发布于 2022-09-15 20:46 湖北
根本不会状态压缩
点赞 回复
分享
发布于 2022-09-15 21:03 上海
太牛了,状态压缩得好好练练了
点赞 回复
分享
发布于 2022-09-15 21:35 上海
大佬第二题的dfs思路可以讲讲吗
点赞 回复
分享
发布于 2022-09-15 22:10 广东
兄弟,*******从此秋招不迷路
点赞 回复
分享
发布于 2022-09-16 13:10 澳大利亚

相关推荐

28 117 评论
分享
牛客网
牛客企业服务