1

我正在处理学校的家庭作业问题。我需要创建 2 个int[]数组。第一个数组int[10]用 random 填充integers。第二个数组与第一个数组中的数字相同,但没有任何重复。

例如,假设我的第一个数组是1,2,2,3,1,5,5,7,9,9. 我的第二个数组将是1,2,3,5,7,9.

有人可以指出我解决这个问题的正确方向。

4

5 回答 5

4

将数字放入Set。然后从集合中检索数字。简单的!重复的将被自动删除!

于 2012-04-18T13:31:02.713 回答
2

我会做以下事情(假设这是家庭作业,你不应该做任何太复杂的事情)......

  1. 使用排序数组java.util.Arrays.sort(myArray);- 这将对数字进行排序,并确保所有重复的数字彼此相邻。
  2. 循环遍历数组并记录唯一数字的数量(即将当前数字与下一个数字进行比较——如果它们不同,则将计数器加 1)
  3. 将第二个int[]数组创建为正确的大小(从第 2 点开始)
  4. 重复与第 2 点相同的过程,但用唯一数字填充新数组,而不是增加计数器。

这应该足以让您朝着正确的方向前进。当您有一些代码时,如果您仍有疑问,请回到我们这里询问。

于 2012-04-18T13:29:19.257 回答
1

我建议使用Set,但这里有一种不使用 Set 的方法。(注意:这会起作用,但不要问我这个效率!)

有这样的功能 -

   public static boolean isNumberInArray(int[] array, int number) 
      {
          for(int i=0; i<array.length; i++)
           {
                if(number == array[i])
                   return true;
           }
          return false;
      }

现在在插入新数组之前使用此函数。我让你弄清楚那部分。毕竟是功课!

于 2012-04-18T13:43:53.700 回答
0

提示(WATTO 解释得更好):

a = sorted first array
lastItem = a[0]
append lastItem into new array
for i in 1 to length(a):
   if a[i] != lastItem:
      append a[i] into new array
      lastItem = a[i]
于 2012-04-18T13:34:52.090 回答
0

@WATTO Studios 有一个很好的方法。当涉及重复时,排序总是有用的。

我将建议使用哈希表的替代方法:

  1. 创建一个以整数作为键(原始数组中的数字)和计数器作为值的散列结构。
  2. 遍历原始数组,对于遇到的每个数字增量,它都是哈希表中对应的计数器值。
  3. 再次遍历原始数组。对于每个数字,请检查哈希表。如果关联的计数器大于 1,则删除该值并减少计数器。

我们来看一个实际案例:

4 5 6 4 1 1 3

第一遍将创建下表:

1 -> 2
3 -> 1
4 -> 2
5 -> 1
6 -> 1

第二步一步一步:

4 5 6 4 1 1 3
^

4 has a counter of 2 -> remove and decrement:

1 -> 2
3 -> 1
4 -> 1
5 -> 1
6 -> 1

5 6 4 1 1 3
^

5 has a counter of 1 -> ignore 
6 has a counter of 1 -> ignore 
4 has a counter of 1 -> ignore 
1 has a counter of 2 -> remove and decrement

1 -> 1
3 -> 1
4 -> 1
5 -> 1
6 -> 1

5 6 4 1 3
      ^    
1 has a counter of 1 -> ignore
3 has a counter of 1 -> ignore

最终数组:

5 6 4 1 3

当然,有更有效的方法来处理删除(因为使用数组意味着移位),例如将项目插入到链表中。我会让你决定的。:)

编辑:一种更快的方法,需要一次通过:

  1. 使用与上述相同的哈希结构。
  2. 遍历原始数组。对于每个项目检查表。如果关联的计数器为 0,则将其增加到 1。如果它已经为 1,则删除该项目。
于 2012-04-18T13:34:54.993 回答