-4

一意の乱数を含む配列があるとしましょう (数値の範囲は 0 から 20 までと小さい)。例えば:

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

次の配列を次のようなものに変換するにはどうすればよいですか:

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

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 は完全にランダムにすることができます (ただし、2 つ以上の同一の数値が含まれることはありません)。配列 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 に答える