华为4.20笔试
为数不多做的还行的笔试,太菜了
第一题 100%
做题,10道判断 10*2,10道单选 10*4,5道多选 5*8,总共100分。按顺序做,错三个结束。给定分数,问有多少种可能的情况
package huawei; import java.util.Scanner; public class Main { static int ans = 0; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int score = scanner.nextInt(); dfs(score,1,0); System.out.println(ans); } static void dfs(int target,int i,int wrong){ if(target == 0){ ans++; return; } if(i>25 || wrong >= 3){ return; } if(i<=10){ dfs(target-2,i+1,wrong); dfs(target,i+1,wrong+1); }else if(i<=20){ dfs(target-4,i+1,wrong); dfs(target,i+1,wrong+1); }else if(i<=25){ dfs(target-8,i+1,wrong); dfs(target,i+1,wrong+1); } } }
第二道题 100%
给两个树的层序遍历数组,和一个替换节点的路径,问替换后的树的层序遍历数组
package huawei; import sun.reflect.generics.tree.Tree; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; class TreeNode{ int val; TreeNode left; TreeNode right; TreeNode(int _val){ this.val = _val; this.left = null; this.right = null; } } public class Main2 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String temp = scanner.nextLine(); temp = temp.substring(1,temp.length()-1); String[] str = temp.split(","); int[] nums1 = new int[str.length]; for(int i =0;i<str.length;i++) nums1[i] = Integer.parseInt(str[i]); String[] nodePath = scanner.nextLine().split("/"); int[] nodePathNum = new int[nodePath.length-1]; for(int i = 1;i<nodePath.length;i++) nodePathNum[i-1] = Integer.parseInt(nodePath[i]); temp = scanner.nextLine(); temp = temp.substring(1,temp.length()-1); str = temp.split(","); int[] nums2 = new int[str.length]; for(int i =0;i<str.length;i++) nums2[i] = Integer.parseInt(str[i]); int k = 1; TreeNode root = new TreeNode(nums1[0]); Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); while(!queue.isEmpty()){ TreeNode node = queue.poll(); if(k<nums1.length && nums1[k]!=0) { node.left = new TreeNode(nums1[k]); queue.add(node.left); } if(k+1<nums1.length && nums1[k+1]!=0){ node.right = new TreeNode(nums1[k+1]); queue.add(node.right); } k = k +2; } k = 1; TreeNode root2 = new TreeNode(nums2[0]); queue = new LinkedList<>(); queue.add(root2); while(!queue.isEmpty()){ TreeNode node = queue.poll(); if(k<nums2.length && nums2[k]!=0) { node.left = new TreeNode(nums2[k]); queue.add(node.left); } if(k+1<nums2.length && nums2[k+1]!=0){ node.right = new TreeNode(nums2[k+1]); queue.add(node.right); } k = k +2; } if(nodePathNum.length>1) { replace(root,root2,nodePathNum,1); }else root = root2; queue = new LinkedList<>(); queue.add(root); String ans = "["; while(!queue.isEmpty()){ TreeNode node = queue.poll(); ans = ans + node.val + "," ; if(node.left!=null) queue.add(node.left); if(node.right!=null) queue.add(node.right); } ans = ans.substring(0,ans.length()-1) +"]"; System.out.println(ans); } static void inorder(TreeNode node){ if(node==null) return; System.out.println(node.val); inorder(node.left); inorder(node.right); } static void replace(TreeNode root,TreeNode root2,int[] path,int i){ if(i==path.length-1){ if(root.left!=null && root.left.val == path[i]){ root.left = root2; return; }else if(root.right!=null && root.right.val == path[i]){ root.right = root2; return; } } if(root.left!=null && root.left.val == path[i]){ replace(root.left,root2,path,i+1); }else if(root.right!=null && root.right.val == path[i]){ replace(root.right,root2,path,i+1); } } }
给定一组服务器的权值及对应父节点,每个服务器的权值既是cost也是贡献,任意两个服务器之前切换的代价为权值差的绝对值。给定一个任务数,问满足任务需求且cost最小的运行路径。
(大概是这么个意思)
package huawei; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main3 { static int ans = Integer.MAX_VALUE; static int[] id ; static int[] pid; static int[] child; static Map<Integer,Integer> map = new HashMap<>(); public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); id = new int[n]; pid = new int[n]; child = new int[n]; for(int i =0;i<n;i++) child[i] = -1; for(int i =0;i<n;i++) { id[i] = scanner.nextInt(); map.put(id[i],i); } for(int i =0;i<n;i++) { pid[i] = scanner.nextInt(); if(pid[i]!=0){ int ind = map.get(pid[i]); child[ind] = i; } } int target = scanner.nextInt(); for(int i =0;i<n;i++){ boolean[] vis = new boolean[n]; dfs(vis,target-id[i],i,id[i]); } ans = ans==Integer.MAX_VALUE?-1:ans; System.out.println(ans); } static void dfs(boolean[] vis,int target,int i,int cost){ vis[i] = true; if(target <=0){ ans = Math.min(ans,cost); return; }else{ int parent = pid[i]==0?-1:map.get(pid[i]); int children = child[i]; if(parent!=-1 && !vis[parent]){ dfs(vis,target-id[parent],parent,cost + id[parent] + Math.abs(id[i] - id[parent])); } if(children!=-1 &&!vis[children]){ dfs(vis,target-id[children],children,cost + id[children] + Math.abs(id[i] - id[children])); } } } }