-4

假设我有一个包含唯一随机数的数组(其中数字的可能范围很小,为 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必须以与数组 A 中相同的顺序包含从 0 到 array.Length-1) 的所有数字。

4

1 回答 1

9
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();
于 2013-09-17T20:47:36.060 回答