java 从交错数组和多维数组中打印两个数组之间的公共元素

nwsw7zdq  于 2023-10-14  发布在  Java
关注(0)|答案(2)|浏览(88)
  1. int[][] arr1 = new int[][] {{1,2,1},{9,7,2},{7,3,6}};
  2. int arr2[][] = new int[][] {{2,6,8},{0,1,7},{7,2,0},{8,3}};
  3. boolean duplicate= false;
  4. for(int i=0;i<arr1.length;i++) {
  5. for(int j=0;j<arr1[i].length;j++) {
  6. int transpose = 0;
  7. transpose = arr1[i][j];
  8. for(int k=0;k<arr2.length;k++) {
  9. duplicate = false;
  10. for(int l=0;l<arr2[k].length;l++) {
  11. if(transpose == arr2[k][l]) {
  12. System.out.println(transpose);
  13. duplicate = true;
  14. break;
  15. }
  16. }
  17. if(duplicate)
  18. break;
  19. }
  20. }
  21. }
  22. }

}
我试着不使用任何快捷方式,只使用for循环和if语句逻辑地打印常见元素。逻辑是,在数组1中,我迭代每个元素,并检查它是否在数组2中,如果它在那里,我们必须在控制台中打印它。但问题是数组1中的元素“1,2,7”迭代了2次并打印了2次。
得到这个输出:1 2 1 7 2 7 3 6
预期输出:1 2 7 3 6
在这里,我必须停止迭代两次,因为一旦打印出来就已经检查过了。注意:我只想回答循环语句和条件语句没有散列集或快捷方式。

qv7cva1a

qv7cva1a1#

你需要为每个 array 执行一个 loop,然后为每个 sub-array 执行一个 loop
此外,我在这里使用 * Set * 来防止重复值。

  1. Set<Integer> d = new TreeSet<>();
  2. int i, ni, j, nj;
  3. for (int[] x : arr1)
  4. for (i = 0, ni = x.length; i < ni; i++)
  5. for (int[] y : arr2)
  6. for (j = 0, nj = y.length; j < nj; j++)
  7. if (x[i] == y[j]) d.add(x[i]);

输出

  1. [1, 2, 3, 6, 7]

理想情况下,只需将每个值添加到 * List * 中,首先检查 List

  1. List<Integer> d = new ArrayList<>();
  2. int i, ni, j, nj;
  3. for (int[] x : arr1)
  4. for (i = 0, ni = x.length; i < ni; i++)
  5. for (int[] y : arr2)
  6. for (j = 0, nj = y.length; j < nj; j++)
  7. if (x[i] == y[j] && !d.contains(x[i])) d.add(x[i]);
展开查看全部
hvvq6cgz

hvvq6cgz2#

  • 注意:此解决方案假设我们必须仅使用原始类型,循环和if/else语句 *
  1. import java.util.*;
  2. public class Main {
  3. public static void main(String[] args) {
  4. // Note: If not limited to primitive types, loops, and if statements.
  5. // A better option would be using a Set<int>. It would be a similar process
  6. // to the below solution, but far more efficient as insertion and retrieval
  7. // of values would be O(1) instead of O(n).
  8. // when limited to using only primitives, arrays, and if statements
  9. int[][] arr1 = new int[][] {{1,2,1},{9,7,2},{7,3,6}};
  10. int[][] arr2 = new int[][] {{2,6,8},{0,1,7},{7,2,0},{8,3}};
  11. // find one of the array's flattened size
  12. int seenSize = 0;
  13. for (int i = 0; i < arr1.length; i++) {
  14. for (int j = 0; j < arr1[i].length; j ++) {
  15. seenSize++;
  16. }
  17. }
  18. int[] seen = new int[seenSize];
  19. // iterate over the same array to create an array of any unique seen element
  20. int seenIndex = 0;
  21. for (int i = 0; i < arr1.length; i++) {
  22. for (int j = 0; j < arr1[i].length; j++) {
  23. if (!valueIsPresentIn(arr1[i][j], seen, seenIndex)) {
  24. seen[seenIndex] = arr1[i][j];
  25. seenIndex++;
  26. }
  27. }
  28. }
  29. // Note: sorting the list of seen items would make this next step more efficient, then binary search could be used.
  30. int[] printed = new int[seenSize];
  31. int printedIndex = 0;
  32. // iterate over the second array searching for a similar occurrence in the list of
  33. // seen values, if something is found and it has not been printed, we need to print
  34. // it and add to the list of already printed values
  35. for (int i = 0; i < arr2.length; i++) {
  36. for (int j = 0; j < arr2[i].length; j++) {
  37. if (valueIsPresentIn(arr2[i][j], seen, seenIndex)) {
  38. if (!valueIsPresentIn(arr2[i][j], printed, printedIndex)) {
  39. printed[printedIndex] = arr2[i][j];
  40. System.out.println(printed[printedIndex]);
  41. printedIndex++;
  42. }
  43. }
  44. }
  45. }
  46. }
  47. // Method to search for a value, this is unnecessary if no longer limited to
  48. // primitive types as there are built-in methods and countless libraries/solutions
  49. // to this.
  50. public static boolean valueIsPresentIn(int value, int[] array, int maxIndex) {
  51. for (int searchIndex = 0; searchIndex < maxIndex; searchIndex++) {
  52. if (array[searchIndex] == value) {
  53. return true;
  54. }
  55. }
  56. return false;
  57. }
  58. }
展开查看全部

相关问题