全部评论
第二题直接随机输出yes和no , 骗了20%,笑死
AC了 第一题前缀和保存在列表里,对1到L的每个n判断:遍历列表中的每个前缀和prefix, prefix+n在不在列表里; 第二题 初始化root之后建树,再之后递归判断每个节点的isBalance() ,也挺简单的。 // 建树 static TreeNode build(TreeNode root, int val){ if(root == null) return new TreeNode(val); if(root.val > val) root.left = build(root.left, val); else root.right = build(root.right, val); return root; } // 判断 static boolean isBalance(TreeNode root, int N){ if(root == null) return true; int left = 0, right = 0; TreeNode node = root; while(node.left != null){ node = node.left; left++; } node = root; while (node.right != null){ node = node.right; right++; } return Math.abs(left - right) <= Math.min(11, N) && isBalance(root.left, N) && isBalance(root.right, N); }
第一题0.6第二题0.2
今天的机试感觉比前几次的简单啊,a了两道
第一题测试用例都过,就是AC 0%😅
第二题是要根据序列重建一颗二叉排序树再分别计算左右结点的深度嘛 后面时间不够了 没写出来重建二叉树 还是有其他的方法😂
第一题怎么找连续区间啊,有人能解答一下吗
第二题,0.2,将数组排序后,构建二叉排序树,然后对树中的每个节点进行判断,是否满足题意,不知道哪里出了问题。感觉没错啊 Arrays.sort(res); //将排序数组转化成二叉排序树 TreeNode root=arrayToTreeNode(res,0,res.length-1); if (root==null){ System.out.println("NO"); }else{ Queue<TreeNode> queue=new LinkedList<>(); queue.add(root); boolean flag=true; int n=res.length; int temp=Math.min(11,n/2); while (!queue.isEmpty()){ TreeNode cur=queue.poll(); if (!Ablance(cur,temp)){ flag=false; break; if (cur.left!=null){ queue.add(cur.right if (cur.right!=null){ queue.add(cur.right) if (flag){ System.out.println("YES"); }else{ System.out.println("NO")
第二个写二叉树太费时间了==
public static int digui(List<Integer> tree, int n, boolean t){ if(tree.isEmpty()){ return 0; } List<Integer> left = new ArrayList<>(); List<Integer> right = new ArrayList<>(); int root = tree.get(0); int length = tree.size(); for(int i = 1; i < length; i++){ int cur = tree.get(i); if(cur < root){ left.add(cur); }else{ right.add(cur); } } int leftN = digui(left, n, true); int rightN = digui(right, n, false); // int height = Math.max(leftN, rightN) + 1; if(Math.max(leftN, rightN) - Math.min(leftN, rightN) >= n || leftN == -1 || rightN == -1){ return -1; }else{ if(t){ return leftN + 1; }else{ return rightN + 1; } } } 第二题核心代码这样写的,不知道哪里错了,完整代码在我帖子里,有大佬可以看看嘛?
差了五分钟写出来的,不知道思路对不对,不用建树,把数组导入队列,比头节点小的导入左队列,大的放入右队列,对两个队列递归求出深度,判断是否满足a-balance,不知道这么考虑是否有问题。int judge(queue<int>& q,int n) { if (q.size() == 0) return 0; int temp = q.front(); q.pop(); queue<int> left; queue<int> right; while (!q.empty()) { int t = q.front(); if (t > temp) { right.push(t); q.pop(); } else { left.push(t); q.pop(); } } int l = judge(left, n); int r = judge(right, n); if (l == -1 || r == -1) return -1; if (abs(r - l) > min(11, n)) return -1; else return max(l, r) + 1; } int main() { int group; cin >> group; while (group--) { int n; cin >> n; vector<int> array(n); queue<int> q; for (int i = 0; i < n; i++) { cin >> array[i]; q.push(array[i]); } if(judge(q, n)!=-1) cout<<"yes"<<endl; }
阿里编程题可以跳出界面用本地idea吗?
第一题感觉很简单,全A,就是读题意花了快10分钟。第二题,感觉不难,但是还要自己创建二叉树有点蛋疼,最后来不及了,骗了20%😂
有大佬可以说一下第二题的大概题意么
第二题 t = int(input()) for _ in range(t): n = int(input()) nums = list(map(int, input().split())) def dfs(nums): if len(nums) <= 1: return True root = nums[0] left = [] right = [] for num in nums[1:]: if num > root: right.append(num) else: left.append(num) Abs = abs(get_left([root]+left) - get_right([root]+right)) return dfs(left) and dfs(right) and Abs < ban def get_left(nums): c = 0 tmp = nums[0] for num in nums[1:]: if num<tmp: c += 1 tmp = num return c def get_right(nums): c = 0 tmp = nums[0] for num in nums[1:]: if num>tmp: c += 1 tmp = num return c ban = min(11, n//2) if dfs(nums): print("YES") else: print("NO")
1.2简历直接给我挂了
😥第一题a了96%,给我气的
相关推荐
查看6道真题和解析 非技术面试记录
点赞 评论 收藏
分享
点赞 评论 收藏
分享