网易编程题

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
 1 class Cmp {
 2 public:
 3     int cmp(int g1, int g2, vector<vector<int> > records, int n) {
 4         // write code here
 5         vector<int>more_than_g1;
 6         vector<int>more_than_g2;
 7         vector<int>less_than_g1;
 8         vector<int>less_than_g2;
 9         for(int i=0;i<n;i++)
10         {
11             if(records[i][0]==g1)
12                 less_than_g1.push_back(records[i][1]);
13             if(records[i][1]==g1)
14                 more_than_g1.push_back(records[i][0]);
15             if(records[i][0]==g2)
16                 less_than_g2.push_back(records[i][1]);
17             if(records[i][1]==g2)
18                 more_than_g2.push_back(records[i][0]);
19              
20         }
21         if(find(less_than_g2.begin(),less_than_g2.end(),g1)!=less_than_g2.end())
22             return -1;
23         if((find(less_than_g1.begin(),less_than_g1.end(),g2))!=less_than_g1.end())
24                 return 1;
25         for(int i=0;i<more_than_g1.size();i++)
26          {
27              
28             if((find(less_than_g2.begin(),less_than_g2.end(),more_than_g1[i]))!=less_than_g2.end())
29                 return -1;
30         }
31         for(int i=0;i<more_than_g2.size();i++)
32          {
33             
34             if((find(less_than_g1.begin(),less_than_g1.end(),more_than_g2[i]))!=less_than_g1.end())
35                 return 1;
36         }
37         return 0;
38     }
39 };
40 添加笔记

 



2.

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

给定二叉树的根节点root,请返回所求距离。

 

 1 /*
 2 struct TreeNode {
 3     int val;
 4     struct TreeNode *left;
 5     struct TreeNode *right;
 6     TreeNode(int x) :
 7             val(x), left(NULL), right(NULL) {
 8     }
 9 };*/
10  
11 class Tree {
12 public:
13     int minleaf=100000;
14     int maxleaf=0;
15     void getmaxmin(TreeNode *root)//最大叶子和最小叶子
16     {
17         if(root==NULL)
18             return;
19         if(root->left==NULL &&root->right==NULL)
20             {
21             if(root->val<minleaf)
22                 minleaf=root->val;
23             if(root->val>maxleaf)
24                 maxleaf=root->val;
25         }
26         getmaxmin(root->left);
27         getmaxmin(root->right);
28     }
29      
30     TreeNode *getcommon(TreeNode *root)//两个节点的公共节点
31         {
32         if(root==NULL)
33             return NULL;
34         if(root->val==minleaf || root->val==maxleaf)
35             return root;
36         TreeNode *pl=getcommon(root->left);
37         TreeNode *pr=getcommon(root->right);
38         if(pl==NULL)
39             return pr;
40         else if(pr==NULL)
41             return pl;
42         else
43             return root;
44              
45     }
46      
47     int getdist(TreeNode *src,TreeNode *des)//计算两个节点之间的距离
48         {
49         if(src==NULL)
50             return -1;
51         if(src->val==des->val)
52             return 0;
53         int dist=getdist(src->left,des);
54         if(dist==-1)
55             dist=getdist(src->right,des);
56         if(dist!=-1)
57             return dist+1;
58         return -1;
59     }
60     int getDis(TreeNode* root) {
61         // write code here
62        getmaxmin(root);
63        TreeNode *min=new TreeNode(minleaf);
64        TreeNode *max=new TreeNode(maxleaf);
65        TreeNode *com=getcommon(root);
66        int minpath=getdist(com,min);
67        int maxpath=getdist(com,max);
68        return minpath+maxpath;
69     }
70      
71      
72 };
73 添加笔记

 

 

 

 

 

3.

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。

给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。

测试样例:
[1,3,5,2,2],5,3
返回:2
 1 class Finder {
 2 public:
 3     void swap(int &a,int &b)
 4      {
 5         int tmp=a;
 6         a=b;
 7         b=tmp;
 8     }
 9     int partition(vector<int> &a,int left,int right)
10     {
11         int tmp=a[left];
12         while(left<right)
13         {
14             while(left<right&&a[right]>=tmp)
15                 right--;
16             swap(a[right],a[left]);
17             while(left<right&&a[left]<=tmp)
18                 left++;
19             swap(a[right],a[left]);
20         }
21         a[left]=tmp;
22         return left;
23     }
24      
25     int getK(vector<int>a,int left,int right,int k)
26      {
27          
28             int p=partition(a,left,right);
29             int len=p-left+1;
30             if(len==k)
31                  return a[len];
32             else if(len<k)
33                 return getK(a,p+1,right,k-len);//k比len还大
34             else
35                 return getK(a,left,p-1,k);//k比len还小
36              
37          
38     }
39     int findKth(vector<int> a, int n, int K)
40     {
41         // write code here
42         return getK(a,0,n-1,K);
43     }
44 };
45 添加笔记

 

posted @ 2016-08-24 20:26  ranran1203  阅读(319)  评论(0编辑  收藏  举报