【牛客】美团2024届秋招笔试第三场编程真题

1.平均数为k的最长连续子数组【有点难度,主要是这个思路是真没想起来】

题意理解:

        求最长连续子序列,该子序列满足平均值为k的条件

解题思路:

        1.双for循环遍历所有子串,但是超时了

        2.第二种思路, 给所有的元素-平均数k,问题就变成了最长连续子序列,和为0,所以呢?然后相等还是遍历所有子串,和之前没有什么不同了,时间复杂度还是过不去。

        3.第三种思路,借鉴大佬的思路,原来考的是前缀和+哈希表

                哈希表里面存的值是索引,需要注意累加和sum需要用long

                使用pre来记录前n个元素的和,map记录的是截止当前索引i下,元素和为cur

                其实本质思路是:

                        第i个元素的时候求和sum=a, 第j个元素的时候求和sum=a则说明

                       (i,j]区间的元素和为0,故此处长度为0的子串长度为: j-i

1.解题思路

import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Main solution=new Main();Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别int n = in.nextInt();int k = in.nextInt();int[] nums=new int[n];for(int i=0;i<n;i++){nums[i]=in.nextInt();}System.out.println(solution.compute(n,k,nums));}public int compute(int n,int k,int[] nums){//记录结果int maxLen=-1;//前i个数的和long pre=0;Map<Long,Integer> map=new HashMap<>();map.put(0L,0);for(int i=0;i<n;i++){//将avg=k的约束转换为sum=0long cur=pre+nums[i]-k;if(map.containsKey(cur)){maxLen=Math.max(maxLen,i+1-map.get(cur));}else{map.put(cur,i+1);}pre=cur;}return maxLen;}}

2.复杂度分析

时间复杂度:O(n) for循环的存好

空间复杂度: O(2n) map的元素存储损耗

2.小球投盒【不难,但是可能出小问题】

题意理解:

        有一堆盒子,两种操作:

        操作1:往编号为i的元素中放一个球

        操作2:除编号i的元素放一个球

        操作到第几次时,所有盒子里都有小球

解题思路:

        1.用一个list模拟盒子,进行操作,放过球,则将对应元素n移除list, 当前仅当list为空时,所有盒子有小球

        2.考的是控制处理流程,不算难,但是容易超时

        几个超时问题:

        set.clear()会超时,但是set=new HashSet<>()不会,空间换时间的tips

1.解题

import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Main main = new Main();Scanner in = new Scanner(System.in);int n = in.nextInt();int m = in.nextInt();int[][] opts = new int[m][2];for (int i = 0; i < m; i++) {opts[i][0] = in.nextInt();opts[i][1] = in.nextInt();}System.out.println(main.commpute(n, m, opts));}public int commpute(int box, int optNum, int[][] opts) {Set<Integer> set = new HashSet<>();for(int i=1;i<=box;i++) set.add(i);for(int i=1;i<=optNum;i++){int target=opts[i-1][1];//移除一个小球if(opts[i-1][0]==1&&set.contains(target)){set.remove( target);}else if(opts[i-1][0]==2&&(!set.isEmpty())){if(set.contains(target)){set=new HashSet<>();set.add(target);}else{set.clear();}}if(set.isEmpty()){return i;}}return -1;}
}

2.复杂度分析

时间复杂度:O(n) for循环遍历的时间损耗

空间复杂度:O(2n) 盒子的空间损耗+opts操作存储的空间损耗

3.小红结账【简单题】

题意理解:

        共有n个账单,每次k个人吃饭,每次给小红的钱向上取整。

        其中小红的朋友共m个,其中同一个朋友可能参与多次聚餐,需计算,每个人总共需要转给小红的账单。而不是某一个账单需要转的钱!

解题思路:

        题目比较简单。使用payResult[m]维护结果,其中payResult[i]表示n个账单中,第i个朋友需给小红转的钱。

        遍历账单,计算avg平均数

        将平均数,加至指定朋友需付的钱中

        返回结果

        

1.解题

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Main solution=new Main();Scanner in = new Scanner(System.in);int n = in.nextInt();int m = in.nextInt();int[][]  costItem=new int[n][2];String[] friends=new String[n];for(int i=0;i<n;i++){costItem[i][0]=in.nextInt();costItem[i][1]=in.nextInt();in.nextLine();friends[i]=in.nextLine();}long[] payResult=solution.compute(n,m,costItem,friends);for(long num:payResult){System.out.print(num+" ");}}public long[] compute(int n,int m,int[][] costItem,String[] friends){long[] payResult=new long[m];//遍历账单for(int i=0;i<n;i++){String[] num=friends[i].split(" ");// System.out.println("S:"+friends[i]+" | "+num.length);int payItem=(costItem[i][1]+num.length)/costItem[i][0];// System.out.println("Avg:"+payItem);for(int j=0;j<num.length;j++){int index=Integer.valueOf(num[j])-1;payResult[index]+=payItem;}}return payResult;}
}

2.复杂度分析

时间复杂度:O(O^2) 双for循环时间损耗

空间复杂度:O(2n) 账单存储损耗+结果数组存储损耗

4.小美的游戏【简单题】

题意理解

        有个n个元素的数组,将两个元素的ai,aj的乘积换成x,y的乘积,要使整个数组的总和尽可能的大。

解题思路

        为了使整个数组总和尽可能的大,就要使元素尽可能的大,最有效的一个方式如:

        比如获得两个元素: 4*5=20*1 将元素4+5换成20+1,

        所以,尽可能让两个大的元素相乘,并将其转换为1*乘积的两个元素,此时和最大

        1.对数组排序,大数在数组后面

        2.从后面进行遍历,每次将两个最大的数相乘,转换为1*乘积

        3.总是把1放在后面(i),乘积常在前面(i-1)的位置,方便继续两个最大值的相乘。

        4.最后求和        

1.解题

import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Main solution=new Main();Scanner in = new Scanner(System.in);int n = in.nextInt();int k = in.nextInt();long[] nums=new long[n];for(int i=0;i<n;i++){nums[i]=in.nextLong();}System.out.println(solution.compute(n,k,nums));}public long compute(int n,int k,long[] nums){long result=0;Arrays.sort(nums);for(int i=nums.length-1;i>=0;i--){if(k>0&&i>0){nums[i-1]=(long)(((nums[i]%(Math.pow(10,9)+7))*(nums[i-1]%(Math.pow(10,9)+7)))%(Math.pow(10,9)+7));nums[i]=1;k--;}result=(long)((result+nums[i])%(Math.pow(10,9)+7));}return result;}
}

2.复杂度分析

时间复杂度:O(n) for循环的时间损耗

空间复杂度:O(n) nums数组的空间损耗 

5.小美种果树 【简单题】

题意理解

        一个树成熟需要能量值z

        每天浇水+x

        每三天施肥+y

        求累计几天,能量值到达z

解题思路:        

        比较简单,在合适的位置累加x,y,当前且仅当sum>=z时,跳出循环,树成熟

1.解题

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Main solution=new Main();Scanner in = new Scanner(System.in);int x = in.nextInt();int y = in.nextInt();int z = in.nextInt();System.out.println(solution.compute(x,y,z));}public int compute(int x,int y,int z){int sum=0;int i=0;while(sum<z){sum+=x;if(i%3==0){sum+=y;}i++;}return i;}
}

2.复杂度分析

时间复杂度:O(n) while循环的时间损耗

空间复杂度:O(1) 存储result的空间损耗

6.小美的数组重排【简单题】

题意理解

        两个数组,要求元素重排后,对应位置上的元素和满足[1,m]的条件限制

        能满足该条件则输出Yes,负责输出No

        共进行q次判断(询问)

解题思路

        对于数组a升序排列,数组b降序排列

        检查对应位置是否满足值在[1,m]的约束,符合Yes,否则No

        1.遍历q次询问

        2.判断

        3.输出结果

1.解题

import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Main main=new Main();Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别int q=in.nextInt();String[] result=new String[q];for(int i=0;i<q;i++){int n=in.nextInt();int m=in.nextInt();int[] a=new int[n];int[] b=new int[n];for(int j=0;j<n;j++){a[j]=in.nextInt();}for(int j=0;j<n;j++){b[j]=in.nextInt();}result[i]=main.compute(n,m,a,b);}for(String s:result){System.out.println(s);}}public String compute(int n,int m,int[] aArr,int[] bArr){Arrays.sort(aArr);Arrays.sort(bArr);for(int i=0;i<n;i++){if(aArr[i]+bArr[n-1-i]>m||aArr[i]+bArr[n-1-i]<1) return "No";}return "Yes";}
}

2.复杂度分析

时间复杂度:O(nlogn) sort的时间损耗

空间复杂度:O(n)  以为数组存储元素的空间损耗

7.判断ip地址是否合法【不难但易错】

题意理解:

        对于IP地址的判断

        1.是否合法地址

        2.是A\B\C哪类地址

解题思路

        题目比较好理解,但容易出错

         需要注意的地方:

        1.   address.split("\\.")

        当且仅当.在最后一位时:如1.2.3.4.  划分结果 1 2 3 4,但是其实是非法地址

        当且仅当.在第一位时:如  .1.2.3.4  划分结果为  “” 1 2 3 4,非法地址

        2.对于地址每部分,1.02.3.4   02是非法的表达

        3.对于非. 非数组的部分存在时,也是非法表达

1.解题

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Main main=new Main();Scanner in = new Scanner(System.in);String address=in.nextLine();boolean flag=true;//元素检查for(int i=0;i<address.length();i++){if(address.charAt(i)!='.'&&(!Character.isDigit(address.charAt(i)))){flag=false;break;}if(address.charAt(i)=='.'&&i==address.length()-1){flag=false;}}//组成检查if(flag==true){String[] parts=address.split("\\.");if(parts.length!=4) flag=false;else{for(String part:parts){if("".equals(part.trim())){flag=false;break;}if(part.length()>=2&&part.startsWith("0")){flag=false;break;}}}}if(flag==false){System.out.println("invalid");}else{System.out.println(main.compute(address));}}public String compute(String addressStr){String result="";String[] address=addressStr.split("\\.");int part1=Integer.valueOf(address[0]);int part2=Integer.valueOf(address[1]);int part3=Integer.valueOf(address[2]);int part4=Integer.valueOf(address[3]);if(part1<0||part1>255||part2<0||part2>255||part3<0||part3>255||part4<0||part4>255) result="invalid";else if(part1<=125&&part1>=1){result="A_address";}else if(part1==126&&part2==0&&part3==0&&part4==0){result="A_address";}else if(part1<=191&&part1>=128){result="B_address";}else if(part1<=223&&part1>=192){result="C_address";}else {result="other";}return result;}
}

2.复杂度分析

时间复杂度:O(n) for循环时间损耗

空间复杂度:O(1) 结果result空间损耗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/597971.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux网络编程】网络编程套接字(TCP服务器)

【Linux网络编程】网络编程套接字(TCP服务器) 目录 【Linux网络编程】网络编程套接字(TCP服务器)地址转换函数关于inet_ntoa 简单的TCP网络程序TCP sockot API详解socket()bind()listen()accept();connect 完整的TCP服务器代码&#xff08;线程池版&#xff09; 作者&#xff1…

2022软件设计师上半年下午题六

题目 在软件系统中&#xff0c;通常都会给用户提供取消、不确定或者错误操作的选择&#xff0c;允许将系统恢复到原先的状态。现使用备忘录(Memento)模式实现该要求&#xff0c;得到如图6-1所示的类图。Memento包含了要被恢复的状态。Originator创建并在Memento中存储状态。Ca…

FJSP:霸王龙优化算法(Tyrannosaurus optimization,TROA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、柔性作业车间调度问题 柔性作业车间调度问题&#xff08;Flexible Job Shop Scheduling Problem&#xff0c;FJSP&#xff09;&#xff0c;是一种经典的组合优化问题。在FJSP问题中&#xff0c;有多个作业需要在多个机器上进行加工&#xff0c;每个作业由一系列工序组成&a…

穿越代码之海:探寻结构体深层逻辑,展望未来应用新天地

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 结构体作为一种数据结构&#xff0c;其定义和特点决定了它在各种应用中的广泛适用性。随着科技的进步和新兴行业的不断涌现&#xf…

SpringCloud Hystrix 服务熔断、服务降级防止服务雪崩

文章目录 SpringCloud Hystrix 熔断器、服务降级防止服务雪崩需求背景引入依赖启动类加Hystrix注解接口配置熔断常规配置超时断开错误率熔断请求数熔断限流 全局配置可配置项HystrixCommand.Setter参数Command Properties 服务降级 SpringCloud Hystrix 熔断器、服务降级防止服…

【Linux入门】Linux简史

Linux 是什么&#xff1f;Linux 是一款叫做操作系统的软件。 操作系统这款软件有什么样的意义呢&#xff1f;简单来说&#xff0c;比如有顾客买了一台笔记本电脑&#xff0c;这台笔记本电脑由电脑硬件组成&#xff0c;在这堆硬件上一定搭载了一款操作系统。正因为操作系统存在&…

nginx配置实例-反向代理

目录 一、目标-反向代理实现效果 二、安装tomcat 三、配置nginx服务 四、配置反向代理 一、目标-反向代理实现效果 访问过程分析&#xff1a; 二、安装tomcat 1、安装jdk环境 新建/export/server目录 解压jdk 查看是否解压成功 配置jdk软连接 进入jdk的bin目录中&#x…

[Apple Vision Pro]开源项目 Beautiful Things App Template

1. 技术框架概述&#xff1a; - Beautiful Things App Template是一个为visionOS设计的免费开源软件&#xff08;FOSS&#xff09;&#xff0c;用于展示3D模型画廊。 2. 定位&#xff1a; - 该模板作为Beautiful Things网站的延伸&#xff0c;旨在为Apple Vision Pro用户…

在实体类中使用JSONObject对象

有时候我们的业务需求可能字段是json格式&#xff0c;这个时候我们的实体类就对应的也应该是json格式&#xff0c;需要使用到JSONObject这个对象&#xff0c;但是可能会使用不了这个对象&#xff0c;那接下来我将简单介绍如何使用这个对象。 以下为我的实体类中的某个字段&…

Linux进程状态深度解析:探索进程的生命周期

文章目录 一、引言1、进程的概念与重要性2、Linux系统下进程状态的意义3、进程状态与系统性能的关系 二、Linux下进程状态概述1、Linux进程状态的分类2、进程状态信息的获取方法 三、Linux下进程状态详解1、运行状态&#xff08;Running&#xff09;2、可中断睡眠状态&#xff…

乐健体育刷分----AI运动的站姿风车

一.前情提要 1.本文仅作学习参考不得用于其他不当途径&#xff0c;若有问题后果自负 二.操作 1.打开乐健体育 2.点击AI运动&#xff0c;找到站姿风车 3.摄像头对准以下图片&#xff0c;拖动图片或保持不动均可 &#xff08;站姿风车2组及以上效果更佳&#xff09;

14届蓝桥杯省赛 C/C++ B组 T8 整数删除(双向链表,堆)

瞬间定位一个数的左边或者右边&#xff0c;需要用到双向链表。 在过程中不断维护最小值&#xff0c;需要用到堆。 所以定义一个pair类型优先队列&#xff0c;每次取出堆顶进行删除&#xff0c;并且同时让删除元素的左右元素加上其值。 同时需要注意&#xff0c;在删除元素之后…