网易编程题
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 添加笔记