2022Java后端之美团笔试题

本文题目转载自 :https://blog.csdn.net/qq_45915803/article/details/124637118

题目一:
小团饲养了一小缸鱼,并且买了A、B、C三类饲料来喂养它们,小团的饲养计划如下:
—— 在每周一、五、六,喂8粒A类饲料;
—— 在每周二、日,喂5颗B类饲料;
—— 在每周三、四,喂7颗C类饲料。
假设在某个周一,小团一次性购买了A、B、C三类饲料各a、b、c颗,并在当天开始饲养,请问如果小团按照它的饲养计划进行喂食,
请问这批饲料可以吃多少天(周一当天也算一天)?

样例输入
8 6 6
样例输出
2
 
  

分析:

每周一、五、六:喂投8颗A类饲料;

每周二、日:喂投5颗B类饲料;

每周三、四:喂投7颗C类饲料;

由此可得序列:8-5-7-7-8-8-5 该序列每七天一循环。

-8 -5 -7 -7 -8 -8 -5
0 1 2 3 4 5 6

将该序列存入一数组中,对应下标加一代表其对应每周的哪一天,例如下标为0 则0+1=1代表星期一,-8表示那一天A饲料剩余总值减去8;

[0]-[4]-[5]存储A饲料的剩余数

[1]-[6]存储B饲料的剩余数

[2]-[3]存储C饲料的剩余数

public class TestDemo1 {
    //8 5 7 7 8 8 5 为一周期
    //标记A饲料为8 B饲料为5 C饲料为7
    public static void main(String[] args) {

        /**
         * 针对条件选择相应的测试用例
         */
        int day = days(8,5,7);  //3天
        int day2 = days(8,6,6);  //2天
        int day3 = days(8,3,8);  //1天
        int day4 = days(7,5,7);  //0天
        int day5 = days(8,5,14);  //4天
        int day6 = days(16,5,14);  //5天
        int day7 = days(100,100,100);  //28天
        int day8 = days(23,65,43);  //5天


        System.out.println(day);
        System.out.println(day2);
        System.out.println(day3);
        System.out.println(day4);
        System.out.println(day5);
        System.out.println(day6);
        System.out.println(day7);
        System.out.println(day8);
    }

    public static int days(int a, int b, int c) {
        if (a < 8) {
            return 0;
        }

        int day = 0;
        int[] index = new int[7];
        int a1 = a / 8;  //计算A饲料一共可以吃多少天
        int b1 = b / 5;  //计算B饲料一共可以吃多少天
        int c1 = c / 7;  //计算C饲料一共可以吃多少天
        int periodicity = 0;  //周期数
        while (true){
            a1-=3;  //计算A饲料一共可以吃多少周
            b1-=2;  //计算B饲料一共可以吃多少周
            c1-=2;  //计算C饲料一共可以吃多少周
            if (a1<0||b1<0||c1<0){
                break;
            }
            periodicity++;  //最后得出一共吃了几个星期
        }
        index[5] = a;  //将A饲料的总数存入index[5]中
        index[6] = b;  //将B饲料的总数存入index[6]中
        index[3] = c;  //将C饲料的总数存入index[3]中
        for (int j = 0; j <= periodicity; j++) {
            for (int i = 0; i < index.length; i++) {
                if (i == 0 || i == 4 || i == 5) {
                    if(i == 4){
                        index[4] = index[0];
                    }
                    if(i == 5){
                        index[5] = index[4];
                    }
                    if(i == 0){
                        index[0] = index[5];
                    }
                    index[i] -= 8;

                } else if (i == 1 || i == 6) {
                    if(i == 1){
                        index[1] = index[6];
                    }
                    if(i == 6){
                        index[6] = index[1];
                    }
                    index[i] -= 5;

                } else if (i == 2 || i == 3) {
                    if(i == 2){
                        index[2] = index[3];
                    }
                    if(i == 3){
                        index[3] = index[2];
                    }
                    index[i] -= 7;

                }
                if(index[i] < 0){
                    break;
                }
                day++;
            }
        }
        return day;
    }
}

题目二:

小美得到了一个只包含’0’和’1’两种字符的字符串,现在她可以往这个字符串的任意位置添加任意个字符’1’,请问她至少需要添加多少个字符’1’才能使添加后的字符串是一个回文串?
输入描述
第一行一个整数T,表示有T组数据。
接下来T行,第i行是一个只包含’0’和’1’两种字符的字符串si。
1<=T<=10, 1<=字符串si的长度<=100000
输出描述
T行,每行一个整数,其中第i行表示输入描述中的字符串si至少需要添加多少个字符’1’使其变成回文串。
样例输入
4
10101
00001
01001101
1110
样例输出
0
1
2
3
样例解释
添加的字串用[]示意:
10101=>10101,无需添加即是回文串。
00001=>[1]00001
01001101=>[1]01[1]001101
1110=>1110[1][1][1]
public class TestDemo2 {
    public static void main(String[] args) {
        //判断回文
        /**
         * 测试用例
         */
//        String str = "101010";  //至少添加1个
//        String str = "10101";   //至少添加0个
//        String str = "00001";   //至少添加1个
//        String str = "001001101";   //至少添加4个 [1]001001101-->[1]0[1]01001101-->[1]0[1][1]01001101-->[1]0[1][1]010[1]01101
//        String str = "1110";   //至少添加3个
//        String str = "0010";   //至少添加1个
//        String str = "01001101";   //至少添加2个
        Scanner sc = new Scanner(System.in);
        System.out.println("输入要判断的行数:");
        int n = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            System.out.println("请输入字符串:");
            add(sc.next());
        }
//        System.out.println("请输入字符串:");
//        String str = sc.nextLine();
//        add(str);


    }

    public static void add(String str){
        LinkedList linkedList = new LinkedList();
        for (int i = 0; i < str.length(); i++) {
            linkedList.add(str.charAt(i));
        }

        int count = 0;
        int i = 0;
        int j = linkedList.size()-1;
        while (i<=j){
            for (i = 0,j = linkedList.size()-1; i < linkedList.size(); i++,j--) {
                if(linkedList.get(i)==linkedList.get(j)){
                    continue;
                }else {
                    if(linkedList.get(j).equals('0')){
                        linkedList.add(j+1, '1');
                        count++;
                        break;
                    } else if (linkedList.get(i).equals('0')) {
                        if(i==0){
                            linkedList.addFirst('1');
                        }else {
                            linkedList.add(i,'1');
                        }
                        count++;
                        break;
                    }
                }
            }
        }
        for (int k = 0; k < linkedList.size(); k++) {
            System.out.print(linkedList.get(k));
        }
        System.out.println("至少需要添加"+count+"个1");

    }
}

 题目三:

时间限制: 3000MS
内存限制: 589824KB
题目描述:
小团在一个无限长的一维坐标轴上玩一个探险游戏,初始时他位于原点,并有k点体力。每往正方向走一格(无法往反方向移动)需要消耗一点体力。要求小团在任何时刻体力都不能小于零。已知坐标轴上有n个坐标上有体力药水,到达这些坐标时,可以恢复一定量的体力。小团想知道,他所能到达的最远坐标是多远?

输入描述 第一行两个正整数k、n,分别表示小团初始有k点体力,以及坐标轴上有n个坐标上有体力药水。 接下来一行n个正整数,第i个数xi表示在xi这个坐标上有体力药水。(xi互不相同) 接下来一行n个正整数,第i个数ti表示在xi这个坐标上的体力药水可以恢复ti点体力。 1<=k <=2000000, 1<=n<=20000,1<=xi<=100000000,1<= ti<=10000 输出描述 一行一个正整数,表示小团所能到达的最远坐标。 样例输入 5 2 6 3 1 2 样例输出 8 提示 样例解释1 初始有5点体力,到达坐标3时还剩余2点体力,补充2点,共余4点; 到达坐标6时还剩下1点,补充1点,共余2点; 耗尽体力时处于坐标8。 输入样例2 2 1 2 1 输出样例2 3 样例解释2 初始有2点体力,在坐标2补充1点体力到达坐标3。 输入样例3 2 1 3 1 输出样例3 2 样例解释3 初始有2点体力,到达坐标2耗尽体力停止。

public class TestDemo3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入初始体力和药水总数:");
        int initialValue = sc.nextInt();;   //初始体力
        int liquidMedicine = sc.nextInt();     //坐标上药水的总数

        int[] x = new int[liquidMedicine];  //每瓶药水所在坐标
        int[] t = new int[liquidMedicine];  //对应坐标上每瓶药水的恢复体力值

        System.out.println("请输入每瓶药水所在坐标:");
        for (int i = 0; i < liquidMedicine; i++) {
            x[i] = sc.nextInt();
        }
        System.out.println("请输入对应坐标上每瓶药水的恢复体力值:");
        for (int i = 0; i < liquidMedicine; i++) {
            t[i] = sc.nextInt();
        }

        HashMap coord = new HashMap();
        if(liquidMedicine>0){
            for (int i = 0; i < liquidMedicine; i++) {
                coord.put(x[i], t[i]);
            }
        }
        Set set = coord.keySet();
        int count=0;
        while (initialValue>0){
            count++;
            for (Integer integer : set) {
                if(count==integer){             //到达药水位置
                    initialValue+=coord.get(integer);   //获得体力
                }
            }
            initialValue--;
        }
        System.out.println(count);
    }
}

你可能感兴趣的:(java后端美团面试题,java,面试)