检查1维数组是否是另外2维数组的每一行的子集



假设有一个1D数组test[]={1,2,3}和2D数组arr1[3][5]={{1,2,5,4,3},{3,7,1,4,2},{2,9,7,8,3}}

输出所需的内容是:

test is the subset of row 0 of arr1
test is the subset of row 1 of arr1
test is not the subset of row 2 of arr1

这是我到目前为止已实施的代码:

class GFG {
    public static void main(String args[]) {
        int arr1[][] = { { 11, 1, 13, 3, 7 }, 
                         { 11, 1, 17, 7, 3 }, 
                         { 2, 5, 8, 9, 10 } };
        int test[] = { 11, 3, 7, 1 };
        int m = arr1.length; // rows
        int n = test.length;
        int o = arr1[0].length; // no. of elements in each row
        System.out.println(o); // just for testing if it works
        int i = 0;
        int j = 0;
        int k = 0;
        for (i = 0; i < n; i++) {
            for (j = 0; j < m && j != m; j++) {
                for (k = 0; k < o; k++)
                    if (test[i] == arr1[j][k])
                        break;
                if (k == o)
                    System.out.println("test[] is " + "not a subset of arr1 " + j + " row");
                else
                    System.out.println("test[] is " + "subset of arr1 " + j + " row");
            }
        }
    }
}

但是我从中获得的输出是:

在这里输出

我意识到这是I循环努力反复打印它,但在这种情况下,我并没有获得令人满意的输出。

在这里可以做什么?还是该问题有很多最佳的实现?欢迎任何建议。

您弄乱了周期的订单:您应该先迭代arr。这个想法是ti使用标志: isSubset,当连续发现某些元素contains时,它会变成false,如果当前检查元素在一排。

可以进行改进(例如foreach循环和标记的休息),但我决定保持代码简单。

public class GFG {
    public static void main(String args[]) {
        int arr[][] = { { 11, 1, 13, 3, 7 }, 
                         { 11, 1, 17, 7, 3 }, 
                         { 2, 5, 8, 9, 10 } };
        int test[] = { 11, 3, 7, 1 };

        for (int i = 0; i < arr.length; i++) {
            boolean isSubset = true;
            for (int j = 0; j < test.length; j++) {
                boolean contains = false;
                for (int k = 0; k < arr[i].length; k++) {
                    if (test[j] == arr[i][k]) {
                        contains = true;
                        break;
                    }
                }
                if (!contains) {
                    isSubset = false;
                    break;
                }
            }
            if (isSubset) {
                System.out.println("test[] is " + "subset of arr " + i + " row");
            } else {
                System.out.println("test[] is " + "not a subset of arr " + i + " row");
            }
        }
    }
}

尝试将解决方案分解为较小的方法,因此您的代码将更清晰,您可以更轻松地考虑正在发生的事情。这是一个可以完成的示例:

class GFG {
  public static void main(String args[]) {
    int arr1[][] = { { 11, 1, 13, 3, 7 },
          { 11, 1, 17, 7, 3 },
          { 2, 5, 8, 9, 10 } };
    int test[] = { 11, 3, 7, 1 };
    System.out.println(arr1[0].length); // just for testing if it works
    for (int i = 0; i < arr1.length; i++) {
      if (isSubset(test, arr1[i])) {
        System.out.println("test[] is " + "subset of arr1 " + i + " row");
      } else {
        System.out.println("test[] is " + "not a subset of arr1 " + i + " row");
      }
    }
  }
  /* returns true if arr contains all elements of sub */
  static boolean isSubset(int[] sub, int[] arr) {
    for (int e : sub) {
      if (!contains(e, arr)) return false;
    }
    return true;
  }
  /* returns true if arr contains elem */
  static boolean contains(int elem, int[] arr) {
    for (int e : arr) {
      if (elem == e) return true;
    }
    return false;
  }
}

最新更新