在N人的聚会中,每个人只有一个人认识。这样的人可能在聚会中,如果是的话,他不认识聚会中的任何人。我们只能问“ A知道B吗? ”。在最少的问题中找到陌生人(名人)。
我知道可以使用队列或堆栈来解决此问题,但我想先使用蛮力解决它,然后再练习。我的尝试遍历矩阵,看哪一行全为0。现在,我该如何再次检查该行是否包含一个0和其余的1s?这是我的代码:
public static int[][] matrix = {{0, 0, 1, 0},
{0, 0, 1, 0},
{0, 0, 0, 0},
{0, 0, 1, 0}};
public static void main(String[] args) {
if(knowsCeleb() > 0){
System.out.println(knowsCeleb() + " is the celebrity.");
}else{
System.out.println("There is no celebrity.");
}
}
public static int knowsCeleb(){
int count = 0;
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[i].length; j++){
if(matrix[i][j] == 0){
count++;
}else{
count = 0;
break;
}
}
if(count == matrix[i].length){
return (i+1);
}
}
return 0;
}
在这种情况下,第三行是名人,因为它不认识一个人(该行中为0),但每个人都知道它(该列中为1s)。如何修复我的代码,以便它仔细检查正确的列是否包含1和一个零。例如,此输入:
public static int[][] matrix = {{0, 0, 1, 0},
{0, 0, 1, 0},
{0, 0, 1, 0},
{0, 0, 0, 0}};
即使没人知道4(在最后一列中没有1),它也会显示4是名人。如何执行第二次检查以确认它实际上是名人?请帮忙!
最佳答案
如果我正确地理解了目标,则看来您已经描述了确认矩阵条目所必须满足的条件:“仔细检查正确的列是否包含1和一个零。”因此,我们可以创建一个可以做到这一点的方法,显式检查列中是否包含一和一个零:
public static boolean confirm(int column){
int zeros = 0;
int ones = 0;
column = column - 1; // java indexes from zero, so we decrement column
boolean confirmed = false; // set the result initially unconfirmed
// for each row
for(int i = 0; i < matrix[column].length; i++){
// if the value in the specified column is zero
if (matrix[i][column] == 0)
// add to zeros
zeros++;
// otherwise if the value in the specified column is one
else if (matrix[i][column] == 1)
// add to ones
ones++;
}
// the condition we want to double check
// "correct column contains 1s and one zero"
if (zeros == 1 && ones == 3){
confirmed = true; // confirm
}
return confirmed;
}
现在我们有了可用的方法,从main调用它:
System.out.println("Confirm " + knowsCeleb() + ": " + confirm(knowsCeleb()));
给输出类似:
3 is the celebrity.
Confirm 3: true
关于java - Java名人算法的蛮力解决方案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47625932/