面试问题是这样的:
给定一些数字n
的数组,您如何找到smallest
largest
和average
?
我所做的答案是sorting the elements of the array
,first
元素是smallest
,last
是largest
。
但是面试官告诉我排序(假设它需要O(n)
,找到平均值可能需要再次O(n)
)。她补充说she wanted a solution without sorting
。
有关如何在optimally?
中执行此操作的任何想法。是否有适用于此情况的预定义算法?
(虽然我对任何C
/ C++
/ Java
答案甚至pseudo codes
感到满意,但 C#
中的任何答案都是如此 非常感谢。
答案 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);
}
}
答案 2 :(得分:0)
面试官通常期望逻辑,而不是快捷方式,因为所有快捷方式仅在内部使用大逻辑,因此您应该遵循以下步骤。
这需要O(n)。
for循环n次
取第一个号码并与所有其他号码进行比较,这里你会得到小号和大号
同时使用另一个变量为循环
在for循环之后,您将获得最小,最大以及添加所有数字
然后你知道找到平均值(加/ n)......
这是执行此操作的一些代码:
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
}