9.28 滴滴笔试 100 72
秋招到现在一场面试都没有,给鼠鼠一个机会吧求面试求意向
第一题上来我直接dfs,过了82%,加了个剪枝,就直接100%了
import java.util.Scanner;
public class first {
public static int ans=0;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] wood=new int[3];
wood[0]=in.nextInt();
wood[1]=in.nextInt();
wood[2]=in.nextInt();
int[][][] find=new int[wood[0]+1][wood[1]+1][wood[2]+1];
if(judge(wood)){
find[wood[0]][wood[1]][wood[2]]=1;
ans++;
}
dfs(n,1,wood,find);
System.out.println(ans);
}
public static void dfs(int n,int cut,int[] wood,int[][][] find){
if(cut>n)
return;
for(int i=0;i<3;i++){
if(wood[i]>cut){
wood[i]-=cut;
boolean flag=false;
//判断这种当前的组合是否已经计算过,是的话就不用再往下dfs了
if(find[wood[0]][wood[1]][wood[2]]==1){
flag=true;
}
if(judge(wood)&&!flag){
find[wood[0]][wood[1]][wood[2]]=1;
ans++;
}
if(!flag)
dfs(n,cut+1,wood,find);
wood[i]+=cut;
}
}
}
public static boolean judge(int[] wood){
if(wood[0]+wood[1]>wood[2]&& Math.abs(wood[0]-wood[1])<wood[2])
return true;
return false;
}
}
第二题用HashMap+List存树,每次询问都用bfs求所有距离再求和,过了72%
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class second {
public static void main(String[] args) throws IOException {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
String[] first_line=bf.readLine().split(" ");
int n = Integer.valueOf(first_line[0]);
int m = Integer.valueOf(first_line[1]);
HashMap<Integer, List<Integer>> map=new HashMap<>();
for(int i=0;i<n;i++){
map.put(i+1,new ArrayList<>());
}
String[] second_line=bf.readLine().split(" ");
int index=0;
for(int i=2;i<=n;i++){
int node=Integer.valueOf(second_line[index++]);
List<Integer> first=map.get(i);
first.add(node);
map.put(i,first);
List<Integer> second=map.get(node);
second.add(i);
map.put(node,second);
}
String[] third_line=bf.readLine().split(" ");
for(int i=0;i<m;i++){
int start=Integer.valueOf(third_line[i]);
int ans=bfs(start,n,map);
System.out.println(ans);
}
}
public static int bfs(int start,int n,HashMap<Integer, List<Integer>> map){
boolean[] visited=new boolean[n+1];
Queue<Integer> queue=new LinkedList<>();
queue.add(start);
int ans=0;
int distance=1;
while(!queue.isEmpty()){
int nums=queue.size();
while(nums>0){
int st=queue.poll();
visited[st]=true;
List<Integer> neighbours=map.get(st);
for(int neighbour:neighbours){
if(visited[neighbour]==false){
queue.add(neighbour);
ans+=distance;
}
}
nums--;
}
distance++;
}
return ans;
}
}
查看23道真题和解析