【问题标题】:Create 2 arrays - 1st has random integers, 2nd has unique random integers创建 2 个数组 - 第一个具有随机整数,第二个具有唯一的随机整数
【发布时间】:2012-04-29 22:05:16
【问题描述】:

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

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

谁能指出我解决这个问题的正确方向。

【问题讨论】:

  • 关于作业的问题,请务必添加作业标签。
  • aaaand...到目前为止你尝试了什么

标签: java arrays random duplication


【解决方案1】:

@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,则删除该项目。

【讨论】:

    【解决方案2】:

    我建议使用 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;
          }
    

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

    【讨论】:

    • 甜蜜!我想这就是我的老师想要的。我从这里得到的 :) 谢谢!
    • 我在哪里发布我最后得到的解决方案?
    【解决方案3】:

    提示(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]
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 但这对于家庭作业来说会不会太复杂?这个问题看起来好像海报只是 Java 的新手,并且可能正在学习数组,所以使用 Set 可能太技术性了?
      • 是的,可能。但是他可以通过使用套装获得奖励积分! :D
      • 不,你是对的,我可能会尝试两种方法,因为我们还没有学习 Set。我说的是 FOR/WHILE 循环,我猜现在才刚刚开始了解数组的知识水平……我们收到的可能有用的“提示”是使用布尔数组来确定是否使用某种方式重复了一个数字的标志。不知道如何实现......
      • @user1341419 请看我的第二个回答。我定义的函数将帮助您处理布尔数组部分。不过老实说,您根本不需要布尔数组。您可以只检查函数中的布尔值并决定是否要将数字放入新数组中。
      【解决方案5】:

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

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

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

      【讨论】:

      • 太棒了!我会用代码回复你!谢谢:)
      • 很高兴为您提供帮助。如果您的问题已得到解决,请记得在已接受的答案上“打勾”。
      猜你喜欢
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 2021-06-24
      • 1970-01-01
      • 2012-04-12
      • 2018-08-22
      相关资源
      最近更新 更多