2023年美团秋招编程岗第二批笔试

java 复制代码
class main1 {
    public static void main(String[] args) throws IOException {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(br.readLine());

        //输入数组元素
        String[]s=br.readLine().split(" ");
        long[]a=new long[n];
        for(int i=0;i<n;i++){
            a[i]=Long.parseLong(s[i]);
        }

        //cur记录当前元素和上一个元素相乘的最大值,若改变,则记录当前元素的下标curId
        BigInteger max=BigInteger.valueOf(-1);
        BigInteger sum=BigInteger.valueOf(0);
        int curId=0;
        for(int i=1;i<n;i++){
            BigInteger curVal=BigInteger.valueOf(a[i]);
            BigInteger lastVal=BigInteger.valueOf(a[i-1]);
            BigInteger cur=curVal.multiply(lastVal);
            if(cur.compareTo(max)>0){
                curId=i;
                max=cur;
            }
            sum=sum.add(curVal);
        }
        BigInteger ans=sum.add(max)
                .add(BigInteger.valueOf(a[0]))
                .subtract(BigInteger.valueOf(a[curId]))
                .subtract(BigInteger.valueOf(a[curId-1]));
        System.out.println(ans);
    }
}
java 复制代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.math.BigInteger;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        //输入
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[]a=new int[n];
        long sum=0;
        for(int i=0;i<n;i++){
            a[i]=sc.nextInt();
            sum+=a[i];
        }

        //众数的最大可能出现次数是n/n-1
        //n--sum%n==0,所有元素全部相同
        //n-1--sum%n!=0,需要舍弃一个元素,剩下n-1个元素全部相同
        long ans=0L;
        if(sum%n==0){
            //n个元素相同,众数出现次数为n
            long target=sum/n;
            ans=calOps(a,target,-1);
        }else{
            //n-1个元素相同,众数出现次数为n-1
            Arrays.sort(a);
            //比较排除最大值/最小值后,哪种情况得到的操作数更小
            ans=Math.min(cal(a,sum,0), cal(a,sum,a.length-1));
        }

        System.out.println(ans);
    }

    //排除一个元素后,计算最小操作数
    private static long cal(int[] a, long sum, int exId) {
        sum=sum-a[exId];
        long target=sum/(a.length-1);

        if(sum%(a.length-1)==0){
            //能整除
            return calOps(a,target,exId);
        }else{
            //不能整数,target上下分别取整计算一次
            return Math.min(calOps(a,target,exId),calOps(a,target+1,exId));
        }
    }

    //计算 把元素变成target的操作数
    private static long calOps(int[] a, long target, int exId) {
        long add=0L;
        long minus=0L;
        for(int i=0;i<a.length;i++){
            if(i==exId)continue;//跳过被排除的元素

            if(target-a[i]>0){
                add+=target-a[i];//累加需要增加的次数
            }else{
                minus+=a[i]-target;//累计需要减少的次数
            }
        }

        //每次操作可以同时处理一次add和minus,抵消后剩下的差由被排除的元素承担
        return Math.max(add,minus);
    }
}
java 复制代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;


//相邻字符都不相等的01串只有两种可能
//0开头,01交替
//1开头,10交替
public class Main {
    static boolean isAchieved;
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        char[]s=sc.next().toCharArray();
        int n=s.length;
        int[][][]dp=new int[n][n][2];
        
        int res=0;
        //dp[i][j][k]子串i~j变成结尾为k的交替串,需要反转的次数
        dp[0][0][s[0]-'0']=0;//结尾是原字符,翻转次数0
        dp[0][0][1-s[0]+'0']=1;//结尾是翻转后的字符,翻转次数1

        for(int i=0;i<n;i++){
            for(int j=i;j<n;j++){
                if(i==0&&j==0)continue;//已完成初始化,跳过

                int bit=s[j]-'0';//当前字符原始值
                //以当前字符结尾,翻转次数等于【i,j-1】结尾为1-bit(和当前位不同)的次数
                dp[i][j][bit]=dp[i][j-1][1-bit];
                //以当前字符翻转结尾,翻转次数等于【i,j-1】结尾为bit的次数+1(翻转一次)
                dp[i][j][1-bit]=dp[i][j-1][bit]+1;

                //累加最小值
                res+=Math.min(dp[i][j][bit],dp[i][j][1-bit]);
            }
        }

        System.out.println(res);
    }
}
java 复制代码
class main4{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int q=sc.nextInt();
        while(q-->0){
            double m=sc.nextInt();
            double x=sc.nextInt();
            if(x%m==0){
                System.out.println((int)m);
            }else{
                System.out.println((int)(x%m));
            }
        }
        sc.close();
    }
}
java 复制代码
class main5{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int t=sc.nextInt();
        while(t-->0){
            int n=sc.nextInt();//数组长度
            int k=sc.nextInt();//操作次数

            //输入数组元素
            int[]a=new int[n];
            for(int i=0;i<n;i++){
                a[i]=sc.nextInt();
            }

            //加减操作
            for(int i=0;i<k;i++){
                int u=sc.nextInt();
                int v=sc.nextInt();

                a[u-1]+=1;
                a[v-1]-=1;
            }

            //判断是否升序
            boolean ok=true;
            for(int i=1;i<n;i++){
                if(a[i]<a[i-1]){
                    ok=false;
                    break;
                }
            }
            if(ok) System.out.println("Yes");
            else System.out.println("No");

        }

        sc.close();
    }
}
java 复制代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.math.BigInteger;
import java.util.*;

//DP
public class Main {
    static final int MOD=1000000007;
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        long[]a=new long[n];
        long sum=0;
        for(int i=0;i<n;i++){
            a[i]=sc.nextInt();
            sum+=a[i];
        }

        //dp[i][j]
        //从后往前,用j~n-1位置上的数,凑出总和为i的方案总数
        long[][]dp=new long[(int)(sum+1)][n+1];
        dp[0][n]=1;//凑出0只有一种方案,即空方案

        //遍历要凑的总和
        for(long i=1;i<=sum;i++){
            //倒序遍历数组
            //算j前必须先知道j+1的方案
            for(int j=n-1;j>=0;j--){
                long res=0;
                //枚举当前可选的数字
                //在当前位置的后面还有n-1-j个位置没处理
                //所选的数不能太大,综合推导为i-(n-1-j)
                for(long k=1;k<=i-(n-1-j);k++){
                    if(a[j]==k){//不能选和原数组上的元素一样的数
                        continue;
                    }
                    //剩下的和i-k由j+1位往后凑
                    //在j位置凑了k,剩下的i-k需要由后面的j+1~n-1去凑
                    res=(res%MOD+dp[(int)(i-k)][j+1])%MOD;
                }
                dp[(int)i][j]=res;
            }
        }

        System.out.println(dp[(int)sum][0]);
    }
}

|------------------------|----------------------------|------------------------------------|
| 1. 按商家名字的字典序升序输出 | 自动按 key 排序,不用额外写排序代码 | TreeMap(key 是 String,默认按字典序自然排序) |
| 2. 按商家名字分组,每个名字对应多个地址 | 键值对映射:key 是商家名,value 是地址集合 | Map(这里用TreeMap,同时解决排序问题) |
| 3. 同名商家不能重复地址(重复则注册失败) | 地址集合自动去重,重复元素不被添加 | Set(自带去重特性) |
| 4. 要拿到「第一次注册的地址」(主店地址) | 地址集合要保留插入顺序,能快速拿到第一个元素 | LinkedHashSet(按插入顺序保存元素,有序的 Set) |

java 复制代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.math.BigInteger;
import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        String s=sc.nextLine();//读取空行

        //外层TreeMap:解决「按名字字典序排序 + 按名字分组」
        //内层LinkedHashSet:解决「地址去重 + 保留插入顺序(主店地址)」
        //商店名,地址集合
        Map<String,Set<String>>map=new TreeMap<>();

        for(int i=0;i<n;i++){
            String[]meg=sc.nextLine().split(" ");
            String meg0=meg[0].toLowerCase();
            String meg1=meg[1].toLowerCase();

            //确保全小写输入
            if(meg0.equals(meg[0])&&meg1.equals(meg[1])){
                //getOrDefault如果商家名字不存在就新建一个空的
                //LinkedHashSet按插入顺序保存元素,确保第一家是主店后面的是分店
                Set<String>addr=map.getOrDefault(meg0,new LinkedHashSet<>());
                addr.add(meg1);//set自动去重
                map.put(meg0,addr);
            }
        }

        for(Map.Entry<String,Set<String>> entry:map.entrySet()){
            System.out.println(entry.getKey()+" "
                    +entry.getValue().iterator().next()+" "
                    +(entry.getValue().size()-1));
        }
    }
}
相关推荐
哈哈哈哈~7 小时前
Jmeter 的使用
jmeter·测试
爱码驱动1 天前
校园IT交流论坛-软件测试报告(功能/接口/自动化)
自动化·测试
甜甜圈圈子1 天前
基于CANoe的uds诊断的配置以及使用
测试
Bear on Toilet2 天前
1.1 认识测试
测试
aka卡卡3 天前
搭建Mock服务
测试
kekegdsz4 天前
高丢包、高延迟、断网秒切:开源一个 Android 弱网测试利器
android·测试
呼啦啦5615 天前
初认识测试
测试
甜甜圈圈子5 天前
从传统测试到敏捷测试:你必须跨越的7大难关!
测试
智擎软件测评小祺7 天前
渗透测试报告关键模块拆解
网络·web安全·渗透测试·测试·检测·cma·cnas