Дан массив nums, состоящий из 2n элементов в виде [x1, x2, ..., xn, y1, y2, ..., yn].

Верните массив в виде [x1, y1, x2, y2, ..., xn, yn].

Пример 1:

Ввод: nums = [2,5,1,3,4,7], n = 3

Выход: [2,3,5,4,1,7]

public int[] Shuffle(int[] nums, int n) {
    int[] result = new int[nums.Length];
    
    int z = 0;

    for (int x = 0; x < (2 * n); x += 2) {
        result[x] = nums[z]; 
        z++;
    }
    
    z = 0;

    for (int y = n; y < (2 * n); y++) {
        result[z + 1] = nums[y];
        z += 2;
    }

    return result;
}
-2
MannyDev 15 Окт 2021 в 12:59

2 ответа

Лучший ответ

Там мы идем:

void Main()
{
    var nums = new[] { 2, 5, 1, 3, 4, 7 };
    
    var result = Shuffle(nums, 3);
    Console.WriteLine(String.Join(",", result));
}

public int[] Shuffle(int[] nums, int n) =>
    nums
        .Take(n)
        .Zip(nums.Skip(n), (x, y) => new[] { x, y })
        .SelectMany(z => z)
        .ToArray();

Это дает мне:

2,3,5,4,1,7

Или это:

public int[] Shuffle(int[] nums, int n) =>
(
    from zs in nums.Take(n).Zip(nums.Skip(n), (x, y) => new[] { x, y })
    from z in zs
    select z
).ToArray();
0
Enigmativity 15 Окт 2021 в 10:19

Вы можете вычислить, какой элемент следует разместить в i -м индексе:

public static int[] Shuffle(int[] nums) {
  // Since we have public method, we should validate input
  if (null == nums)
    throw new ArgumentNullException(nameof(nums));

  if (nums.Length % 2 != 0)
    throw new ArgumentOutOfRangeException(nameof(nums));

  int[] result = new int[nums.Length];

  // All we have to do is to place right item at i-th index:
  for (int i = 0; i < nums.Length; ++i)
    result[i] = nums[i / 2 + (i % 2) * (nums.Length / 2)];

  return result;
}

Обратите внимание, что мы можем избавиться от n, поскольку мы можем легко вычислить его как n == nums.Length / 2.

Та же идея реализована через Linq:

public static int[] Shuffle(int[] nums) {
  if (null == nums)
    throw new ArgumentNullException(nameof(nums));

  if (nums.Length % 2 != 0)
    throw new ArgumentOutOfRangeException(nameof(nums));

  return Enumerable
    .Range(0, nums.Length)
    .Select(i => nums[i / 2 + (i % 2) * (nums.Length / 2)])
    .ToArray();
}
0
Dmitry Bychenko 15 Окт 2021 в 10:29