微软100题-天天做-第36题

来源:互联网 发布:fi是什么软件 编辑:程序博客网 时间:2024/06/05 05:42

36.引用自网友:longzuo(运算)
谷歌笔试:
n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系,
存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j的队伍中更强的一支。

所以w[i][j]=i 或者j,现在给出它们的出场顺序,并存储在数组order[n]中,
比如order[n] = {4,3,5,8,1......},那么第一轮比赛就是 4对3, 5对8。.......
胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不再细分,即可以随便排,
下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是4对5,直至出现第一名

编程实现,给出二维数组w,一维数组order 和 用于输出比赛名次的数组result[n],
求出result。

package com.microsoft;import java.util.Random;public class Competetion {private int[][]w;private int n;private int []order;private int[]result;public Competetion(int n){this.n=n;w=new int[n][n];for(int i=0;i<n;i++){for(int j=0;j<n;j++){int random=new Random().nextInt(2);if(random==1){w[i][j]=i;}else{w[i][j]=j;}}}order=new int[n];for(int i=0;i<n;i++){order[i]=i;}int rest=n;while(rest>0){rest--;int r1=new Random().nextInt(n);int r2=new Random().nextInt(n);int tmp=order[r1];order[r1]=order[r2];order[r2]=tmp;}result=new int[n];}public void competetion(){competetion(1);buildResult();}private void buildResult(){int max=Integer.MIN_VALUE;for(int i=0;i<result.length;i++){max=Math.max(max, result[i]);}for(int i=0;i<result.length;i++){result[i]=max+1-result[i];}}public void competetion(int depth){int leave=0;int index=-1;for(int i=0;i<result.length;i++){if(result[i]==0){leave++;index=i;}}if(leave==0){return;}if(leave==1){result[index]=depth;return;}for(int i=0;i<order.length;){int left=-1;int right=-1;if(result[order[i]]==0){left=order[i];for(int j=i+1;j<order.length;j++){if(result[order[j]]==0){right=order[j];i=j+1;break;}}}else{i++;continue;}if(right==-1){break;}if(left!=-1&&right!=-1){if(w[left][right]==left){result[right]=depth;}else{result[left]=depth;}}}competetion(depth+1);}public void print(){for(int i=0;i<order.length;i++){System.out.print(order[i]+" ");}System.out.println();System.out.println("result:");for(int i=0;i<result.length;i++){System.out.print(result[i]+" ");}}public static void main(String[] args) {Competetion c=new Competetion(10);c.competetion();c.print();}}


0 0
原创粉丝点击