2

我有一个简单的问题,我需要一种快速的方法来实现它。假设我有两列

1 6 
3 5
5 3 

如您所见,第 2 列中存在元素 3 和 5,我想在第 1 列中生成一个新的随机元素,这样第 2 列中将没有匹配的元素。元素可以是 1 -> 12

我的方法:我已将第二列中的所有元素添加到哈希集中,然后搜索第一列中的元素,并检查它们是否在哈希集中,如果是,请尝试生成一个新的随机元素。

我有另一个想法是将问题可视化为一维数组,删除重复项等,但我不想修改第二个数组中的任何元素。

4

4 回答 4

0

您可以使用以下步骤: 1. 创建一个数组。2.用最小值到最大值填充它。3. 随机排列阵列。顺序读取数组。

使用 Fisher-Yates shuffle 算法进行 suffle

于 2013-11-12T07:07:08.173 回答
0

我认为这是一个相当直接的解决方案

    Random r = new Random();
    List<Integer> numbers = new ArrayList<>(Arrays.asList(new Integer[] {
            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }));

    Integer[] colOne = new Integer[] { 6, 5, 3 };
    numbers.removeAll(Arrays.asList(colOne));

    int notFoundInColOne = numbers.get(r.nextInt(numbers.size()));

本质上,我们创建了我们的范围,删除了该范围中也在列中的元素,然后从我们范围的剩余部分中选择一个随机元素。

于 2013-11-12T00:48:48.627 回答
0

我认为这种方法对您有用:对于从 1 到 12 的每个数字,如果该数字不在第 2 列中,则将其添加到列表中。当第 1 列未填充时,从列表中随机选择一个项目并将其删除,然后将其添加到第 1 列。

于 2013-11-12T04:26:04.237 回答
0
  1. column2值放到HashSet.

  2. 只需使用(Math.random() * 12)+1它将生成从 1 到 12 的数字。

  3. 现在搜索生成的数字是否存在于set如果存在而set不是重新生成,即转到步骤2,否则完成。

希望能帮助到你。

编辑

O(1)

我只取一个小样本,即 5

  1. 首先创建一个包含 1 到 5 的数组a [] = {1, 2, 3, 4, 5}
  2. 现在尝试生成一个从 1 到 5 的随机数(这里您正在生成数组的索引),假设它生成 2 而不是将最后一个元素替换为 2 。所以现在数组将是 a[] = {1, 5, 3, 4} 并减少索引值。
  3. 现在您必须生成一个从 1 到 4 的随机数。假设 3 比交换 3 和最后一个值。所以数组是 {1, 5, 4}。减少索引,即现在 3。
于 2013-11-12T00:20:25.990 回答