网易2016实习研发工程师编程题

牛客网上的题

1 比较重量

小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量。这些钻石的重量各不相同。在他们们比较了一段时间后,它们看中了两颗钻石g1和g2。现在请你根据之前比较的信息判断这两颗钻石的哪颗更重。
给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第二个元素为较轻的钻石的编号。最后给定之前的比较次数n。请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0。输入数据保证合法,不会有矛盾情况出现。
测试样例:
2,3,[[1,2],[2,4],[1,3],[4,3]],4
返回: 1

思路:有向图,生成图的邻接矩阵后通过prim算法判断两点之间是否有路径。

 1 import java.util.*;
 2
 3 public class Cmp {
 4     public int cmp(int g1, int g2, int[][] records, int n) {
 5         // write code here
 6         int maxNum = -1;
 7         for (int i = 0; i < n; i++){
 8             maxNum = maxNum > records[i][0] ? maxNum : records[i][0];
 9             maxNum = maxNum > records[i][1] ? maxNum : records[i][1];
10         }
11         boolean [][] dis = new boolean [maxNum + 1][maxNum + 1];
12         for (int i = 1; i <= maxNum; i++){
13             dis[i][i] = true;
14         }
15         for (int i = 0; i < n; i++){
16             dis[records[i][0]][records[i][1]] = true;
17         }
18         for (int k = 1; k <= maxNum; k++){
19             for (int i = 0; i <= maxNum; i++){
20                 for (int j =0; j <= maxNum; j++){
21                     if (dis[i][k] && dis[k][j]){
22                         dis[i][j] = true;
23                     }
24                 }
25             }
26         }
27         if (dis[g1][g2]){
28             return 1;
29         } else if (dis[g2][g1]){
30             return -1;
31         } else {
32             return 0;
33         }
34     }
35 }

错误思路 :直接递归找,有环是死循环。

 1 import java.util.*;
 2
 3 public class Cmp {
 4     public int cmp(int g1, int g2, int[][] records, int n) {
 5         // write code here
 6
 7         for (int i = 0; i < n; i++){
 8             if(records[i][0] == g1){
 9                 if(records[i][1] == g2){
10                     return 1;
11                 }
12                 if (cmp(records[i][1], g2, records, n) == 1){
13                     return 1;
14                 }
15             }
16         }
17         for (int i = 0; i < n; i++){
18             if(records[i][0] == g2){
19                 if(records[i][1] == g1){
20                     return 1;
21                 }
22                 if (cmp(records[i][1], g1, records, n) == 1){
23                     return 1;
24                 }
25             }
26         }
27         return 0;
28     }
29     public static void main(String [] args){
30         int [][] a = {{1,2},{2,4},{1,3},{4,3}};
31         System.out.println(new Cmp().cmp(2, 3, a, 4));
32     }
33 }

2 二叉树

1 有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。
2 给定二叉树的根节点root,请返回所求距离。

思路:二进制编码,然后在编码上找最近公共祖先之后的长度和。

 1 import java.util.*;
 2
 3 /*
 4 public class TreeNode {
 5     int val = 0;
 6     TreeNode left = null;
 7     TreeNode right = null;
 8     public TreeNode(int val) {
 9         this.val = val;
10     }
11 }*/
12 public class Tree {
13     private int min = Integer.MAX_VALUE;
14     private int max = Integer.MIN_VALUE;
15     private String minCode;
16     private String maxCode;
17     public int getDis(TreeNode root) {
18         // write code here
19         binaryCode(root.left, "0", "");
20         binaryCode(root.right, "1", "");
21         int minLen = minCode.length();
22         int maxLen = maxCode.length();
23         int i = 0;
24         while (i < minLen && i < maxLen && minCode.charAt(i) == maxCode.charAt(i)){
25             i++;
26         }
27         return minLen + maxLen - 2 * i;
28     }
29     private void binaryCode(TreeNode node, String code, String prev){
30         if (node == null){
31             return;
32         }
33         String curCode = prev + code;
34         if (node.left == null && node.right == null){
35             if (node.val < min){
36                 min = node.val;
37                 minCode = curCode;
38             }
39             if (node.val > max){
40                 max = node.val;
41                 maxCode = curCode;
42             }
43             return;
44         }
45         binaryCode(node.left, "0", curCode);
46         binaryCode(node.right, "1", curCode);
47     }
48 }

3 寻找第K大

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
测试样例:
[1,3,5,2,2],5,3
返回:2

思路1: 快排,然后判断要的数是在左边还是右边再递归对该部分排序, 注意优化,不用每次都移动。

 1 public class Finder {
 2     public int findKth(int[] a, int n, int K) {
 3         return findKth(a, 0, n-1, K);
 4     }
 5
 6     public int findKth(int[] a, int low, int high, int k) {
 7         int part = partation(a, low, high);
 8
 9         if(k == part - low + 1) return a[part];
10         else if(k > part - low + 1) return findKth(a, part + 1, high, k - part + low -1);
11         else return findKth(a, low, part -1, k);
12
13     }
14
15     public int partation(int[] a, int low, int high) {
16         int key = a[low];
17
18         while(low < high) {
19             while(low < high && a[high] <= key) high--;
20             a[low] = a[high];
21             while(low < high && a[low] >= key) low++;
22             a[high] = a[low];
23         }
24         a[low] = key;
25         return low;
26     }
27 }

思路2:二叉堆维护最大的K个数(最小堆)。

 1 import java.util.*;
 2
 3 public class Finder {
 4     public int findKth(int[] a, int n, int K) {
 5         // write code here
 6         Queue<Integer> priorityQueue =  new PriorityQueue<Integer>();
 7         for (int i = 0; i < n; i++){
 8             if (i < K){
 9                 priorityQueue.add(a[i]);
10             } else if (priorityQueue.peek() < a[i]){
11                 priorityQueue.remove();
12                 priorityQueue.add(a[i]);
13             }
14         }
15         return priorityQueue.remove();
16     }
17 }

快排更优。

时间: 2024-10-10 14:56:21

网易2016实习研发工程师编程题的相关文章

比较重量 网易2016实习研发工程师编程题

题目: 小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. 给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第 二个元素为较轻的钻石的编号.最后给定之前的比较次数n.请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0.输入数据保证合 法,不

网易2016 实习研发工程师 [编程题]寻找第K大 and leetcode 215. Kth Largest Element in an Array

传送门 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2],5,3 返回:2 note: 注意手写快排的时候: while(i < j) { while(j > i && a[j] > a[left]) j--; while(i < j && a[i] <= a[left]) i++; if(i

寻找第K大 网易2016实习研发工程师编程题

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2],5,3 返回:2 投机取巧能通过: 1 class Finder { 2 public: 3 int findKth(vector<int> a, int n, int K) { 4 // write code here 5 sort(a.begin(), a.end()); 6 return

网易2016 实习研发工程师 [编程题]二叉树

传送门 有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离.二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离. 给定二叉树的根节点root,请返回所求距离. 题解: 给每个节点编号(0 - total),用map记录每个节点的父节点 找出最大权值叶子节点 和 最小权值 叶子节点的编号 然后就是寻找最近公共祖先了 1 /* 2 struct TreeNode { 3 int val; 4 struct Tree

网易 2016 实习研发工程师 3道 编程题-2

有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离.二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离. 给定二叉树的根节点root,请返回所求距离. //import java.util.ArrayList;   //import java.util.HashMap;   //import java.util.Iterator;   //import java.util.LinkedList;   //imp

网易 2016 实习研发工程师 3道 编程题-1

小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. 给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第二个元素为较轻的钻石的编号.最后给定之前的比较次数n.请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0.输入数据保证合法,不会有矛盾情况

求职 | 华为研发工程师编程题个人题解【C++】【Python】

华为研发工程师编程题[C++][Python][数学][数组][字符串] 问题1 有这样一道智力题:"某商店规定:三个空汽水瓶可以换一瓶汽水.小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?"答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子.然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板.如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝? 输入描述: 输入文件最多包

搜狐2016研发工程师编程题

1.[编程题]马戏团 搜狐员工小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到, 马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演.考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等. 团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题.小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列.

网易2016研发工程师编程题:路灯

路灯 一条长l的笔直的街道上有n个路灯,若这条街的起点为0,终点为l,第i个路灯坐标为ai,每盏灯可以覆盖到的最远距离为d,为了照明需求,所有灯的灯光必须覆盖整条街,但是为了省电,要是这个d最小,请找到这个最小的d. 输入描述: 每组数据第一行两个整数n和l(n大于0小于等于1000,l小于等于1000000000大于0).第二行有n个整数(均大于等于0小于等于l),为每盏灯的坐标,多个路灯可以在同一点. 输出描述: 输出答案,保留两位小数. 输入例子: 7 1515 5 3 7 9 14 0