9.9 华为笔试
三道笔试题,第一道类似一个字符串的最早子串匹配的位置,不过换成了二维数组的匹配,用暴力检验的方法,80%,最后超时也是正常的,暂时没想到好的办法,可能可以用动态规划吧。第二题是给一个图,然后求递减序列的最大长度,这个题型很常见,用图搜索就可以了,第三题是求树的任意两个连通节点路径的最大异或和,我也是用暴力dfs的方法,没有优化,本以为会超时,但是最后100%通过了。我把第三题答案贴出来分享一下,也求大家指导下第一题的好的思路。
import java.util.Scanner;
public class Main {
public static int max = 0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
boolean[] visited = new boolean[n+1];
int[][] value = new int[n+1][4];
for(int i=0;i<n;i++){
int key = scanner.nextInt();
value[key][0] = scanner.nextInt(); //值
value[key][1] = scanner.nextInt(); //左儿子
value[key][2] = scanner.nextInt(); //右儿子
}
for(int i=1;i<=n;i++){
if(!visited[i]){
dfs(i, value[i][0], value, visited);
visited[i] = true;
}
}
System.out.println(max);
}
// 暴力
public static void dfs(int i, int count, int[][] value, boolean[] visited){
if(value[i][1]==-1 && value[i][2]==-1){
max = Math.max(max, count);
return;
}
if(value[i][1]!=-1){
int temp = value[value[i][1]][0];
max = Math.max(max, temp ^ count);
dfs(value[i][1], count, value, visited);
}
if(value[i][2]!=-1){
int temp = value[value[i][2]][0];
max = Math.max(max, temp ^ count);
dfs(value[i][2], count, value, visited);
}
}
}
查看7道真题和解析