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

时间:2013-10-13 12:14:34

标签: algorithm sorting math

正如问题所说,找到一个算法来排列数组。这是一个Facebook采访问题。

平均值需要准确。我们不是平均值,也不是平均值。或者是平均值。

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

2 个答案:

答案 0 :(得分: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]);
    }

在处理所有情况(重复条目)的现场创建一个算法虽然可能有点棘手。您需要某种形式的递归函数来查找符合条件的下一个条目,但不会破坏列表。

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

  { 2,2,2,4,5,6,2,2,2,2 }

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

答案 1 :(得分:1)

天鹰队长殴打它,但是......

Module Module1

    Sub Main()
        Dim a() As Integer = {9, 4, 7, 6, 4, 4, 3, 4, 1}
        Dim n = a.Length

        'TODO: check that sanity has a reasonable vale
        Dim sanity As Integer = n
        Dim ok As Boolean = False
        Dim temp As Integer

        While Not ok And sanity > 0
            ok = True
            For i = 0 To n - 3
                If ((a(i) + a(i + 2)) / 2) = a(i + 1) Then
                    temp = a(i)
                    a(i) = a(i + 1)
                    a(i + 1) = temp
                    ok = False
                End If

            Next

            sanity -= 1
        End While
        Console.WriteLine("OK: " & ok.ToString())

        Console.WriteLine(String.Join(" ", a))

        Console.ReadLine()

    End Sub

End Module