Java工程师
Java工程师
岗位年限:
1+
面试时间:
2024年1月24日11点
面试方式:
线上
面试问题:
序号 | 问题 | 解答 | 备注 |
---|---|---|---|
1 | 在项目中担任的角色 | 项目介绍 | |
2 | Mybatis介绍一些 | 介绍Mybatis的功能,ORM框架,半自动的,映射,JDBC相关 | |
3 | SpringBoot介绍一下 | 核心的IOC和AOP介绍了一下,beanFactory,beanDifination,bean的简单创建过程,Awire和beanPostProsess和AOP | |
4 | 我们为什么要用框架呢? | 答的使用框架的好处,简化开发流程。不使用框架的麻烦 | |
5 | 为什么用前后台分离的框架呢 | 可以和他人共同协作开发,减少开发周期时间 | |
6 | 你之前使用的是python为什么改用java了 | 之前使用python主要做的是一些数据分析和机器学习内容,核心偏向于统计学。之后大学课程接触到了java并且自学数据结构和算法的时候使用的是严蔚敏教授的数据,讲解代码都是使用的c,对c和java这类强类型语言更感兴趣 |
算法题(用了简单的轮询解法十分钟不到秒了,之后面试官说测试用例给的太少,我可能有一些点没有考虑到,并且性能不高,和我讨论了如何使用二分法进行性能优化,面试结束后又写了性能优化后的代码)
解题思路:从最小阈值开始一点点增加阈值,判断这个阈值是不是能满足限定天数。
最小阈值我和面试官思路一样,肯定是数组最大值。
我的想法是最大阈值肯定是 数组长度/最大限定天数的前几位重量想加之和。
例如 1 2 3 4 5 6 7 8 9 10 限定五天 所以最大阈值肯定是9 + 10 = 19这个条件肯定能在五天之内运送完成。面试官的思想是遍历数组,得到总体重量。一天之内能完成的最大阈值和最小阈值做二分法。
问题描述:
/**
* 有一堆包裹必须在 days 天内从一个港口运送到另一个港口。
* 第 i 个包裹的重量为 weights[i]。
* 每一天,我们都会按给出重量(weights)的顺序往轮船上装载包裹。
* 我们装载的重量不会超过船的最大运载重量。请给出能在 days 天内将所有包裹送达的船的最低运载能力:
* 输入:weights = [1,2,3,4,5,6,7,8,9,10], days = 5
* 输出:15
* 解释:
* 船最低载重 15 就能够在 5 天内送达所有包裹,如下所示:
* 第 1 天:1, 2, 3, 4, 5
* 第 2 天:6, 7
* 第 3 天:8
* 第 4 天:9
* 第 5 天:10
* 请注意,货物必须按照给定的顺序装运
*/
面试时写的
public static int func01(int[] weights,int days){
int[] round = getMax(weights);
int index = 0,minWeight = round[0],maxWeight = round[1],count = 0,day = days;
while (true){
day = days;
while (day > 0 && index < weights.length){
while (index < weights.length && count + weights[index] <= minWeight){
count += weights[index++];
}
day--;
count = 0;
}
if(index >= weights.length)break;
minWeight++;
index = 0;
}
return minWeight;
}
之后优化的
public static int func01(int[] weights,int days){
int[] round = getMax(weights);
int minWeight = round[0],maxWeight = round[1],midWeight;
while (minWeight < maxWeight){
midWeight = (maxWeight + minWeight) / 2;
if(isLegal(weights,days,midWeight)){
maxWeight = midWeight;
}else{
minWeight = midWeight + 1;
}
}
return minWeight;
}
private static boolean isLegal(int[] weights,int days,int weight){
int index = 0,count = 0;
while (days > 0 && index < weights.length){
if(count + weights[index] <= weight){
count += weights[index++];
}else{
count = 0;
days--;
}
}
return days > 0 || index >= weights.length;
}
private static int[] getMax(int[] arr){
int[] res = new int[2];
int temp = arr[0],count = 0;
for (int value : arr) {
if(value > temp)temp = value;
count += value;
}
res[0] = temp;
res[1] = count;
return res;
}