【问题标题】:Convert array with random unique numbers to one with sequentially proceeding numbers? [closed]将具有随机唯一数字的数组转换为具有顺序进行数字的数组? [关闭]
【发布时间】:2013-09-17 20:28:09
【问题描述】:

假设我有一个包含唯一随机数的数组(其中数字的可能范围很小,为 0 到 20)。例如:

[6, 3, 11, 9, 4, 5]

我怎样才能把下面的数组转换成这样的:

[3, 0, 5, 4, 1, 2]

第二个数组从 0 开始,以 (array.Length-1) 结束,但位置与第一个数组中的大小有关。

如何在 C/C++/C# 中以有效的方式实现这一点? (对方法更感兴趣)

我只举了一个例子。它可以是任何东西:

[7, 10, 0, 19, 50, 33, 45, 100]
[1, 2,  0,  3,  6,  4,  5,   7]

数组 A 中的最小数是数组 B 中的 0。数组 A 中的最大数是数组 B 中的 (array.Length-1)。数组 A 可以是完全随机的(只是它永远不会包含两个或多个相同的数字),但数组 A 必须包含从 0 到 array.Length-1) 的所有数字,顺序与数组 A 中的顺序相同。

【问题讨论】:

  • 转换是如何进行的?是A1 - 3吗? A1 / 2?请先尝试自己解决它。
  • Questions asking for code must demonstrate a minimal understanding of the problem being solved. Include attempted solutions, why they didn't work, and the expected results.
  • 我只需要想法/方法来实现这一点。我正在尝试在 C# 中实现它,但我确信如果它适用于 C、C++ 或 C#,这并不重要。
  • 啊哈!如果已排序,您是否希望输出数组成为输入数字的位置?
  • 我不明白针对这个问题的尖酸刻薄。 OP正在要求一种算法,这个问题对我来说似乎很清楚。他表现出“对正在解决的问题的最小理解”。我想他可以添加一些尝试性的解决方案,但我见过更糟糕的问题。

标签: c# c arrays random numbers


【解决方案1】:
int[] list1 = new[] { 7, 10, 0, 19, 50, 33, 45, 100 };
var orderedList = list1.OrderBy(x => x).ToList();
int[] list2 = list1.Select(x => orderedList.IndexOf(x)).ToArray();

编辑

根据@Blorgbeard 的要求

int[] list1 = new[] { 6, 3, 11, 9, 4, 5 };

var dict = list1.OrderBy(x => x)
                .Select((i, inx) => new { i, inx })
                .ToDictionary(x => x.i, x => x.inx);

int[] list2 = list1.Select(x => dict[x]).ToArray();

【讨论】:

  • 非常好,+1。尽管问题很糟糕,但问题仍然很有趣,这是一个非常棒的解决方案。
  • @tnw 没有冒犯 14V,但这是显而易见的解决方案,它看起来像 O(n^2) - 我很想知道它是否可以更有效地完成。
  • @Blorgbeard 解决方案很好,因为它优雅且易于理解。它不是最有效的解决方案,但对于大多数 UI 用例来说应该足够快,而且很容易理解。
  • 我实际上在想array.Select((x, i) => new { x, i }).OrderBy(p => p.x).Select((p, j) => new { p.i, j }).OrderBy(q => q.i).Select(q => q.j).ToArray()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 2019-11-18
  • 1970-01-01
  • 2021-04-14
相关资源
最近更新 更多