4399秋招java岗笔试
切换屏幕会有提醒,但没有限制次数。
有单选题,简答题,编程题。比较简单。
相关知识点
- vlan之间的通信;路由器,中继器,网桥的区别。
- SQL语句
- 场景题:高并发、高可用性的抽卡系统,如何设计架构,如何确保概率,如何实现保底机制。
编程题
第一题
有若干个包间,以及若干组客人在等候,怎样让成功进入包间的客人的组数最多。
例如,包间大小为2,3,3,客人有:1,3,3,4,则最多3组客人能进入。
import java.util.*;
public class Main2{
public static void get (List<Integer>queue,List<Integer>dining) {
Collections.sort(queue);
Collections.sort(dining);
int len_q=queue.size(),len_d=dining.size(),point=0,ans=0;
for(int family:queue){
while(point<len_d &&family>dining.get(point)){
point++;
}
if(point>=len_d){
break;//说明完全放不下了
}
ans++;point++;//指针移动是因为当前房间已经被使用了
}
System.out.println(ans);
}
}
(后知后觉,如果题目换成 让进入成功进入包间的客人的人数最多,那么解法就不是这样。大致思路是下面这样
public static int maxGuests(List<Integer> queue, List<Integer> dining) {
// 对包间大小和客人数量进行排序
Collections.sort(dining);
Collections.sort(queue);
int guestCount = 0;
int guestIndex = 0;
// 遍历每个包间
for (int roomSize : dining) {
// 找到一个适合当前包间大小的客人组
if (guestIndex < queue.size() && queue.get(guestIndex) <= roomSize) {
guestCount += queue.get(guestIndex); // 增加该组的客人数
guestIndex++; // 移动到下一组客人
}
}
return guestCount;
}
第二题
用数组来表示一个n*n大小的图,例如[1,0][0,1],你可以把1个0变成1(也可以不改变),你需要让连通图的大小最大。
例如,在这个图中把1个0换成1的话,连通图的大小可以变成3
import java.util.*;
public class Main3{
static int count=0;
static HashSet<Integer> to_put=new HashSet();
public static void main (String[] args) {
int[][] array=new int[4][4];
array[0]=new int[]{1,1,0,0};
array[1]=new int[]{1,1,0,0};
array[2]=new int[]{0,0,1,1};
array[3]=new int[]{0,0,0,1};
int n=array.length;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
if(array[i][j]==1){
dfs(array,i,j);
put_cnt(array);
count=0;to_put.clear();
}
}
int minn=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
minn=Math.min(minn,array[i][j]);
}
System.out.println(-minn+1);
}
private static void dfs(int[][] array,int row,int col){
array[row][col]=2;//表示已经访问
count++;
int n=array.length;
int[] drx=new int[]{-1,0,1,0};
int[] dry=new int[]{0,1,0,-1};
for(int i=0;i<4;i++){
int n_row=row+drx[i];
int n_col=col+dry[i];
if(n_row>=0&&n_row<n&&n_col>=0&&n_col<n){
if(array[n_row][n_col]==1){
dfs(array,n_row,n_col);
}else if(array[n_row][n_col]<=0){
to_put.add(n_row*n+n_col);
}
}
}
}
private static void put_cnt(int[][] array){
int n=array.length;
for(int position:to_put){
int i=position/n;
int j=position%n;
array[i][j]-=count;
}
}
}
#秋招##笔试#

查看9道真题和解析