首页 > 美团8.8笔试
头像
PraveZhang
编辑于 2020-08-13 10:15
+ 关注

美团8.8笔试

网易的在15点,美团的在16点,想着把网易的快快答完去做美团的,结果网易的题也太难了吧。。就AC了一道,没办法了,网易笔试16:40结束,但是估计再来40分钟也做不出来,果断关了去做美团了。
美团的题还好,都有思路,大概写一写。

1 算平均评分,保留一位小数

很简单,不说了

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long val = 0;
        int count = 0;
        for (int i = 0; i < 5; i++) {
            int ac = scanner.nextInt();
            count +=ac;
            val += ac *(i+1);
        }
        double v = ((double) val) / count;
        System.out.println(Math.floor(v*10)/10);
    }
}

2 优惠券

看懂了题目意思 也没什么难度,加就行了

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int va1 = 0;
        int va2= 0;
        for (int i = 0; i < n; i++) {
            int v1 = scanner.nextInt();
            int v2 = scanner.nextInt();
            if(v1 > v2) {
                va1 += v1;
                va2 += (v1-v2);
            }else {
                va1+= v2;
            }
        }
        System.out.println(va1 + " " + va2);
    }
}

3 送花

题目给的例子太简单了,自己做的时候想错了,最后时间来不及改了,估计暴力搜索会超时就没尝试暴力,最后没AC,遗憾。
重新整理思路,补了一下代码,没办法测试了,如有问题欢迎指正。

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        Tree[] trees = new Tree[n];
        trees[0] = new Tree(1);
        for (int i = 1; i < n; i++) {
            trees[i] = new Tree(i+1);
        }
        for (int i = 1; i < n; i++) {
            int from = scanner.nextInt()-1;
            int to = scanner.nextInt()-1;
            int path = scanner.nextInt();
            trees[from].nexts.add(trees[to]);
            trees[to].father = trees[from];
            trees[to].fromHome = trees[from].fromHome + path;
            trees[to].fromFather = path;
        }
        int retVal1 = trees[0].getLengthFromThisToEveryNode();// 从花店到每个地址的距离总和
        int val = 0;
        int retVal2= 0;// 配送员一共走的路程总和
        int maxTreeFromHome = 0;
        Tree farTree = null;
        for (Tree tree: trees){
            retVal2 += tree.fromFather*2;
            if(tree.fromHome >= maxTreeFromHome){
                maxTreeFromHome = tree.fromHome;
                farTree = tree;
            }
        }
        while(farTree != null){
            val += farTree.fromFather;
            farTree = farTree.father;
        }
        retVal2-=val;
        System.out.println(retVal1+" "+retVal2);


    }
    private static class Tree{
        ArrayList<Tree> nexts;
        Tree father;
        int id;
        int fromHome;//从家到这个地址的距离
        int fromFather;//从上个地址到这个地址的距离

        public int getLengthFromThisToEveryNode(){
            int sum = this.fromHome;
            for (Tree next :nexts)
                sum += next.getLengthFromThisToEveryNode();
            return sum;
        }

        public Tree(int id) {
            this.nexts = new ArrayList<>();
            this.id = id;
        }

    }
}

4 优惠券连连看,合并优惠券得奖励金

本来想着用一个数组去存这个优惠券金额,合并掉的就标记为-1,但是不知道为什么不行,只好用ArrayList,因为优惠券金额只有1到100,所以循环100次把对应金额的合并一下就行,不能合并的留到下一轮。
本题虽然通过了测试用例,但是评论有老哥指出问题,我只考虑从左侧合并,如果出现 1 1 1 这种,合并成 1 22 1 是不一样的,我后来又想了一下,暂时没想出来,后面再更吧。

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            list.add(scanner.nextInt());
        }
        int count = 0;
        for (int i = 1; i <= 100; i++) {
            ArrayList<Integer> nlist = new ArrayList<>();
            for (int j = 0; j < list.size(); j++) {
                if(j== list.size()-1) {
                    nlist.add(list.get(j));
                    continue;
                }
                if(list.get(j) == i &&list.get(j).equals(list.get(j+1))) {
                    nlist.add(i + 1);
                    count ++;
                    j++;
                }else
                    nlist.add(list.get(j));
            }
            list = nlist;
        }
        System.out.println(count);
    }
}

5 黄黑树中不同颜色节点的深度

没有特别大的算法难度,但是不知道为什么我代码只过了91%,按理来说也没有很复杂的循环或递归,极端输入也不会出问题啊。诶,好迷

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        Tree[] trees= new Tree[n+1];
        for (int i = 1; i <= n; i++) {
            trees[i] = new Tree(i,scanner.nextInt() != 1);
        }
        for (int i = 1; i <= n-1; i++) {
            trees[scanner.nextInt()].sons.add(trees[i+1]);
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= n; i++) {
            sb.append(trees[i].calcDepth(0,trees[i].yellow)).append(" ");
        }
        System.out.println(sb.toString().trim());
    }

    private static class Tree{
        ArrayList<Tree> sons;

        int id;
        boolean yellow;

        public Tree(int id, boolean yellow) {
            this.id = id;
            this.yellow = yellow;
            this.sons = new ArrayList<>();
        }
        public int calcDepth(int already,boolean initialColor){
            int myDepth;
            if(this.yellow ==initialColor){
                myDepth = 0;
            }else
                myDepth = already;
            for (Tree son : sons){
                myDepth += son.calcDepth(already+1,initialColor);
            }
            return myDepth;
        }
    }
}

希望给个面试吧~

全部评论

(7) 回帖
加载中...
话题 回帖

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐