阿里笔试8.10(人生第一次全ac)
第一道题
最短距离,直线上选一点使得到给出的N个直线上的点的距离之和最短。
先Arrays.sort()对数组排序,取中位下标(N-1)/2,所有的点到该点距离求和。
最大的坑是要用long,题目本身小学奥数难度,十五年前做过。
用了十分钟,五分钟写完,5分钟确定自己用了long+加调试复制粘贴。
第一题代码
package leecode;
import java.util.Arrays;
import java.util.Scanner;
public class Ali001 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()){
int N=in.nextInt();
long trees[]=new long[(int) N];
for(int i=0;i<N;i++){
trees[i]=in.nextLong();
}
Arrays.sort(trees);
int midindex=(N-1)/2;
long toa=trees[midindex];
long ans=0L;
for(int i=0;i<=midindex;i++){
ans+=toa-trees[i];
}
for(int i=midindex;i<N;i++){
ans+=trees[i]-toa;
}
System.out.println(ans);
}
}
} 第二道题是二叉树谁所在的节点深度更小。
一开始觉得头大,觉得ac一道挺不错,所以没抱啥希望
准备写二叉树,写起来觉得好复杂。决定改用哈希表(动态规划?)输入的时候把深度写道哈希表里。十几分钟写完发现一直报错,改的头大,纠结了十分钟。以为自己记错HashMap函数用法了,想起来还不如用数组。五分钟改完发现本地测试用例迟迟不出结果,重新看了遍题目发现是看错题目了数组长度和循环长度多写了1,改完提交就100了,哈希表写法应该也没错,是我眼神出问题的锅。
感觉这道题想清楚了很简单,想不清楚……构建二叉树然后一堆操作,能写出来真的是大佬把。
复杂度应该是O(n),看了很多朋友们的写法,再回来看自己的想法觉得还是自己的比较好,大家想的太复杂了。
每次添加的时候都记录该节点的深度,比较的时候直接比较小明小强的节点深度就好了,一目了然,应该算是用了动态规划。
写完还有十几分钟,室友也在写,最后a了第一道的80.
代码
package leecode;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Ali003 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()){
int N=in.nextInt();
int M=in.nextInt();
int [] map=new int [N+1];
map[1]=1;
for(int i=2;i<=N;i++){
int now=in.nextInt();
map[i]=map[now]+1;
}
boolean []ans=new boolean[M];
for(int i=0;i<M;i++){
int xq=in.nextInt();
int xm=in.nextInt();
int deepxq=map[xq]; //小强深度
int deepxm=map[xm]; //小明深度
if(deepxq<=deepxm){
ans[i]=true;
}else{
ans[i]=false;
}
}
for(int i=0;i<M;i++){
if(ans[i])
System.out.println("A");
else
System.out.println("B");
}
}
}
}
老板电器公司氛围 197人发布
查看14道真题和解析