比较重量(网易笔试题)
小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量。这些钻石的重量各不相同。在他们们比较了一段时间后,它们看中了两颗钻石g1和g2。现在请你根据之前比较的信息判断这两颗钻石的哪颗更重。
给定两颗钻石的编号 g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第二个元素为较轻的钻石的编号。最后给定之前的比较次数n。请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0。输入数据保证合法,不会有矛盾情况出现。
测试样例:
2,3,[[1,2],[2,4],[1,3],[4,3]],4
返回:
1
java版本的代码实现:
package cn.cat.test;
public class Test {
/**比较重量(网易笔试题)
* @Description:
* @author gwj
* @Created 2017年9月15日 下午4:39:58
* @param args
*/
public static void main(String[] args) {
int g1 = 2, g2 = 3;
//使用Pair类来代替二维数组的表示。例如new Pair(1,2)表示数组[1,2]
Pair[] data = new Pair[]{new Pair(1,2), new Pair(2,4), new Pair(1,3), new Pair(4,3)};
int result = compare(g1, g2, data);
System.out.println(result);
}
static int compare(int g1, int g2, Pair[] data) {
//按正常比较
int result = compareBigger(g1, g2, data);
//如果无法判断结果,则尝试交换两个钻石的比较位置
if (result == 0) {
result = compareBigger(g2, g1, data);
//因为交换了比较位置,注意返回结果是互逆的
result = -result;
}
return result;
}
static int compareBigger(int g1, int g2, Pair[] data) {
for (Pair pair : data) {
if (pair.left == g1) {
if (pair.right == g2) {
//右边元素更好是需要比较的元素,则只需可以得出比较结果,注意返回的数值为1。
return 1;
} else {
//右边元素还不是需要比较的元素,则进行递归查找。
return compareBigger(pair.right, g2, data);
}
}
}
return 0;
}
//键值对封装对象
private static class Pair{
int left;
int right;
public Pair(int left, int right) {
this.left = left;
this.right = right;
}
}
}