【问题标题】:Is there a way I can exclude non repeating numbers in my array without creating another array?有没有一种方法可以在不创建另一个数组的情况下排除数组中的非重复数字?
【发布时间】:2019-04-05 18:13:25
【问题描述】:

我需要创建一个从两个数组中获取数字的输出:ab;并打印出唯一的,但只打印一次。例如,如果有

int[] a = { 4,3,4,3,6,7,4,8,2,9 };
int[] b = { 2,3,6,8,1,5 };`

输出应该是7, 4, 9 不是4, 4, 7, 4, 9

在任务中,它直接说:“不要创建任何辅助数组、集合或字符串。不要使用标准 java.lang 以外的包中的任何类。不能修改数组(特别是不能已排序)。打印值的顺序无关紧要。”

我有 90%,我就是无法让 a 数组不重复数字

public class Main {

    public static void main(String[] args)
    {
        int[] a = new int[]{1,2,12,2,3,4,5,6,7,8,9,7,123};
        int[] b = new int[]{2,1,3,6,4,5,8,9,12};



        for (int i=0;i<a.length;i++)
        {
         int count =0;
         for (int j=0;j<b.length;j++)
         {
            if(b[j]==a[i])count++;
         }
          if (count==0) System.out.print(a[i] + " ");
        }
    }

}

我希望7 123。 实际上它打印7 7 123。 我知道这一定是非常简单的事情,但我只是一个初学者,还不能完全理解它。

非常感谢任何帮助。

【问题讨论】:

  • 用调试器逐步完成,或者只是用纸/笔[cil]玩电脑。
  • 您目前没有任何用于在 single 数组中进行重复数据删除的逻辑。有多种处理方式。
  • 这就是任务的字面意思:“编写一个程序,它定义两个整数数组并打印第一个数组中没有出现在第二个数组中的所有元素,但每个值只出现一次,没有重复。例如对于数组 int[] arr = { 4,3,4,3,6,7,4,8,2,9 }; int[] brr = { 2,3,6,8,1,5 }; 结果可能是(打印值的顺序无关):7 4 9 不要创建任何辅助数组、集合或字符串。不要使用标准 java.lang 以外的包中的任何类。不能修改数组(尤其是它们无法排序)。”
  • @monoxide 当您打印第一个数组中的唯一元素时,假设以 4 为例,4 在 arr 中重复 3 次,因此您检查 count == 0 并打印该值,因为4 在第二个数组中不存在,但也验证您是否已经使用了该数字,只需通过从当前索引 -1 到 0 遍历 arr,如果这是第一次出现,则打印它,如果不是第一次出现,那么你'已经打印了号码。希望这会有所帮助
  • 感谢您的解释以及解决方案! @Juseeth

标签: java arrays for-loop printing unique


【解决方案1】:

在上面的代码中,您正在检查当前号码是否唯一并打印它,但不检查该号码是否已被使用。 由于我们不能使用任何额外的数据结构或修改现有内容,这是我们可以避免打印已经使用的数字的一种方法。


    public class Main {

        public static void main(String[] args)
        {
            int[] a = new int[]{1,2,12,2,3,4,5,6,7,8,9,7,123};
            int[] b = new int[]{2,1,3,6,4,5,8,9,12};



            for (int i=0;i<a.length;i++)
            {
             int count =0;
             for (int j=0;j<b.length;j++)
             {
                if(b[j]==a[i])count++;
             }
              if (count==0 && !visitedPreviously(i-1, a[i], arr)) System.out.print(a[i] + " ");
            }
        }

    private boolean visitedPreviously(int index, int val, int[] arr){
         while(index >= 0){
              if(val == arr[index]){
                 return true; 
              }
           index--;
         }
      return false;

    }

    }

【讨论】:

  • 您的isRepeatingNumber 方法至少有两种损坏。
  • @AndyTurner 现在检查一下,我已经修好了。
  • 没有解释就转储代码不是一个好的答案。您需要解释您所做的与 OP 最初尝试的不同,为什么 OP 的方法不起作用等。
  • @AndyTurner 我在上面的 cmets 中解释了我的方法,我不想复制我的 cmets
  • cmets 是暂时的:它们可能随时被删除。您的答案需要包含所有信息,这样才能独立存在。
【解决方案2】:

这是查找独特元素的一种方法:

int[] a = new int[]{1, 2, 12, 2, 3, 4, 5, 6, 7, 8, 9, 7, 123};
int[] b = new int[]{2, 1, 3, 6, 4, 5, 8, 9, 12};

Stream<Integer> aStream = Arrays.stream(a).boxed();
Stream<Integer> bStream = Arrays.stream(b).boxed();

Set<Integer> intersection = aStream.collect(Collectors.toSet());
intersection.retainAll(bStream.collect(Collectors.toSet()));

Set<Integer> unique = Stream.concat(aStream, bStream).collect(Collectors.toSet());
unique.removeAll(intersection);

System.out.println(unique);

结果将是:

[7, 123]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多