Java 对于给定的行和列和,检查二进制矩阵是否只存在2行

Java 对于给定的行和列和,检查二进制矩阵是否只存在2行,java,matrix,Java,Matrix,我有一个只有2行N列的二进制矩阵 第一行的元素和为A,第二行的元素和为B 列的总和存储在数组C中 If A = 3, B = 2, C = [2,1,1,0,1] Then output is "11001,10100" Explanation: 11001 = sum of 1st row is A = 3 10100 = sum of 2nd row is B = 2 21101 --> This is column sum which indicates Array C. 另一

我有一个只有2行N列的二进制矩阵

第一行的元素和为A,第二行的元素和为B

列的总和存储在数组C中

If A = 3, B = 2, C = [2,1,1,0,1] Then output is "11001,10100"

Explanation:
11001 = sum of 1st row is A = 3
10100 = sum of 2nd row is B = 2

21101 --> This is column sum which indicates Array C.
另一个例子:

If A = 2, B = 3, C = [0,0,1,1,2] Then output is "NO"
我写了下面的程序,用于上面的测试用例,但是当我在面试中运行这个程序时,它只通过了40%的测试用例,你能帮我解决这个问题吗?这个程序中的错误是什么?如何纠正

public static String process(int A, int B, int[] C) {
    int total = 0;
    for (int val : C) {
        total = total + val;
    }
    // Sums do not match so matrix is not possble
    if (total != A + B) {
        return "NO";
    } else {
        String first = "", second = "";

        boolean flag = true;
        for (int i = 0; i < C.length; i++) {
            // Both the columns must be 1
            if (C[i] == 2) {
                first += "1";
                second += "1";
            } else if (C[i] == 0) {
                // Both the columns must be 0
                first += "0";
                second += "0";
            } else {
                // Any one if the columns should be 1
                if (flag) {
                    first += "1";
                    second += "0";
                } else {
                    first += "0";
                    second += "1";
                }
                flag = !flag;
            }
        }
        return first + "," + second;
    }
}
公共静态字符串进程(int A、int B、int[]C){
int-total=0;
for(int val:C){
总计=总计+val;
}
//和不匹配,所以矩阵不可能
如果(总计!=A+B){
返回“否”;
}否则{
字符串first=“”,second=“”;
布尔标志=真;
for(int i=0;i
差不多了,但问题出在这里:

// Any one if the columns should be 1
仅考虑这一点意味着您的两个矩阵将满足
C
提供的条件,但不满足
A
B
,因为您只是交替使用
C[i]==1

这种中断的最简单情况是:
A=2
B=0
C=[1,1]
。您的程序将打印
“10,01”
,而它应该是
“11,00”

所以这里的技巧是:在处理简单的
C[i]==0
C[i]==2
情况后,您必须计算出第一行和第二行中还有多少
1
s

编辑:可能的解决方案是:

boolean flag = true;
int currentTopRowSum = 0;
for (int i = 0; i < C.length; i++) {
// Both the columns must be 1
  if (C[i] == 2) {
    first += "1";
    second += "1";
  } else if (C[i] == 0) {
    // Both the columns must be 0
    first += "0";
    second += "0";
  } else {
    //This is where it went wrong, so I changed this.
    if (currentTopRowSum < A) {
      first += "1";
      second += "0";
      currentTopRowSum++;
    } else {
      first += "0";
      second += "1";
    }
  }
}
boolean标志=true;
int currentTopRowSum=0;
for(int i=0;i

简言之,如果您还没有达到标准,您可以跟踪最上面一行的总和,并将
“1”
添加到该行中。如果有,请将其添加到最下面一行。

您能帮助我如何编写此逻辑以查找所有可能的集合吗?当然,请检查我的答案。它并没有提供所有可能的解决方案,但在给定约束条件À
B
C`的情况下,它将提供正确的解决方案。