排列一个数组,使得它们之间不存在2个数字的平均值

kar*_*aut 6 sorting algorithm math

正如问题所说,找到一个算法来排列数组.这是一个Facebook面试问题.

平均值需要准确.我们不是平均的,也不是平均的.

编辑:举一个例子,如果数字是1,2,5,9,那么排列{1,9,2,5}是有效的,但{1,5,9,2}不是平均值1和9是5并位于它们之间.

Cap*_*awk 1

除非没有有趣的事情(重复条目),初步检查表明这是有效的:

    void check(ref int x, ref int y, int z)
    {
        if ((x + z) / 2 == y)
        {
            int temp = x;
            x = y;
            y = temp;
        }
    }

    int[] nums = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };

    for( int i = 0; i < nums.Count() - 3; i++)
    {
        check(ref nums[i], ref nums[i + 1], nums[i + 2]);
    }
Run Code Online (Sandbox Code Playgroud)

现场为此创建一个处理所有情况(重复条目)的算法,尽管可能有点棘手。您将需要某种形式的递归函数来遍历并找到满足条件的下一个条目,但不会破坏列表。

这可能看起来微不足道,但请考虑以下情况:

  { 2,2,2,4,5,6,2,2,2,2 }
Run Code Online (Sandbox Code Playgroud)

你必须循环回到开头,但仍然没有正确的答案。

  • 一个更有趣的问题。也困难得多。从来不觉得这些问题适合面试。通常有一些“技巧”可以引导您找到正确的答案。你可能有一个非常有能力的编码员,但他不明白你的“技巧”,而你却忽略了他/她。 (2认同)
  • 为了确保我没有胡编乱造,这里有一个从 0 到 99 的数字数组,排列正确: 0 64 32 96 16 80 48 8 72 40 24 88 56 4 68 36 20 84 52 12 76 44 28 92 60 2 66 34 98 18 82 50 10 74 42 26 90 58 6 70 38 22 86 54 14 78 46 30 94 62 1 65 33 97 17 81 49 9 73 41 25 89 57 5 69 37 21 85 53 1 3 77 45 29 93 61 3 67 35 99 19 83 51 11 75 43 27 91 59 7 71 39 23 87 55 15 79 47 31 95 63。 (2认同)