n个最小,最大和平均数组

时间:2014-01-09 06:54:36

标签: c# .net arrays algorithm

面试问题是这样的:

给定一些数字n的数组,您如何找到smallest largestaverage

我所做的答案是sorting the elements of the arrayfirst元素是smallestlastlargest

但是面试官告诉我排序(假设它需要O(n),找到平均值可能需要再次O(n))。她补充说she wanted a solution without sorting

有关如何在optimally?中执行此操作的任何想法。是否有适用于此情况的预定义算法?

(虽然我对任何C / C++ / Java答案甚至pseudo codes感到满意,但 C#中的任何答案都是如此 非常感谢。

5 个答案:

答案 0 :(得分:4)

我只是遍历数组,跟踪总数,并在每次迭代时检查该值是否小于最小值,或者大于最大值,如果是,则将它们存储为新的最小值/最大值。然后,平均值只是将总数除以数组中的项目数。这应该只需要O(n)来做。

答案 1 :(得分:1)

O(n)算法看起来像这样,根本没有排序:

public class Program
{
    public void Main()
    {
        int[] arr = {4, 8, 9, 13, -9, 78, 5};
        FindMinAvgMax(arr);
    }

    public void FindMinAvgMax(int[] a)
    {
        int len = a.Length;
        int sum = 0;
        int min = a[0];
        int max = a[0];
        int avg;

        for(int i = 0; i < len; i++)
        {
            sum += a[i];

            if(a[i] < min)
                min = a[i];
            else if(a[i] > max)
                max = a[i];
        }

        avg = sum /len;

        Console.WriteLine("Min: {0}", min);
        Console.WriteLine("Max: {0}", max);
        Console.WriteLine("Avg: {0}", avg);
    }
}

现场演示:http://dotnetfiddle.net/4Bz80E

答案 2 :(得分:0)

面试官通常期望逻辑,而不是快捷方式,因为所有快捷方式仅在内部使用大逻辑,因此您应该遵循以下步骤。

这需要O(n)。

  1. for循环n次

  2. 取第一个号码并与所有其他号码进行比较,这里你会得到小号和大号

  3. 同时使用另一个变量为循环

  4. 添加相同的所有数字
  5. 在for循环之后,您将获得最小,最大以及添加所有数字

  6. 然后你知道找到平均值(加/ n)......

  7. 这是执行此操作的一些代码:

    static void Main(string[] args)
    {
        int[] a = { 1, 90, 3, 4, 0, 6 };
        int small,big;
        float avg=0;
    
        small = a[0];
        big = a[0];
    
        for (int i = 0; i < a.Length; i++) //O(n) executed n times only
        {
            if (small > a[i])
                small = a[i];
            if (big < a[i])
                big = a[i];
            avg += a[i];
        }
        avg = avg / a.Length;
    
        Console.WriteLine("smallest= " + small + "  largest= " + big + "  Average= " + avg);
        Console.ReadKey();
    }
    

答案 3 :(得分:0)

以下代码使用O(n)的复杂度,而排序将采用O(n * log(n))

static void FindLagestSmalestAvg(int[] array)
{
    int smallest = array[0];
    int largest = array[0];
    int sum = 0;

    for (int i = 0; i < array.Length; i++)
    {
        if (array[i] > largest)
            largest = array[i];

        if (array[i] < smallest)
            smallest = array[i];

        sum += array[i];
    }

    int average = sum / array.Length;

    Console.WriteLine("Smallest = {0}, largest = {1}, average = {2}", smallest, largest, average);
}

答案 4 :(得分:-1)

public void find(int[] a)
{

    int sum = 0;
    int min = 9999999; // any very big int
    int max = -999999; // any smallest int
    int i = 0;
    for(i = 0; i < a.length; i++)
    {
        if(a[i] < min)
            min = a[i];
        if(a[i] > max)
            max = a[i];
        sum+=a[i];
    }

    avg = sum /i;
    // min will contain smallest num, max will contain largest and avg is avgerage
}