Home > Back-end >  Should I use Sum method and Count/Length find the element of array that is the closest to the middle
Should I use Sum method and Count/Length find the element of array that is the closest to the middle

Time:09-29

If I have arr=[1,3,4,-7,9,11], the average value is (1 3 4-7 9 11) /6 = 3.5, then elements 3 and 4 are equally distant to 3.5, but smaller of them is 3 so 3 is the result.

CodePudding user response:

You need to find out what the average is first. That involves a cycle either implemented explicitly, or invoked implicitly. So, let's assume that you already know what the average value is, because your question refers to the way some values related to the average can be obtained. Let's implement a comparison function:

protected bool isBetter(double a, double b, double avg) {
    double absA = Abs(a - avg);
    double absB = Abs(b - avg);
    if (absA < absB) return a;
    else if (absA > absB) return b;
    return (a < b) ? a : b;
}

And now you can iterate your array, always compare via isBetter the current value with the best so far and if it's better, then it will be the new best. Whatever number ended up to be the best will be the result.

CodePudding user response:

Assuming you have worked out the average (avg below) then you can get the diff for each item, then order by the diff, and get the first item. This will give you the closest item in the array

var nearestDiff = arr.Select(x => new { Value=x, Diff = Math.Abs(avg-x)})
                     .OrderBy(x => x.Diff)
                     .First().Value;

Live example: https://dotnetfiddle.net/iKvmhp

If instead you must get the item lower than the average

var lowerDiff = arr.Where(x => x<avg)
                      .OrderByDescending(x =>x)
                      .First();

You'll need using System.Linq for either of the above to work

CodePudding user response:

Using GroupBy is a good way to do it

var arr = new int[] { 1, 4, 3, -7, 9, 11 };
var avg = arr.Average();
var result = arr.GroupBy(x=>Math.Abs(avg-x)).OrderBy(g=>g.Key).First().OrderBy(x=>x).First();

Original Array

[1,4,3,-7,9,11]

After grouping, key is abs distance from average, items are grouped according to that

[2.5, [1]]
[0.5, [4, 3]]
[5.5, [9]]
[7.5, [11]]
[10.5, [-7]]

Order by group keys

[0.5, [4, 3]]
[2.5, [1]]
[5.5, [9]]
[7.5, [11]]
[10.5, [-7]]

Take first group

[4, 3]

Order group items

[3, 4]

Take first item

3

changed array to [1,4,3,-7,9,11], reversing order of 3 and 4 because they are naturally ordered according to the output originally, and this is necessary to prove the last step

CodePudding user response:

I think you are trying to say that you are getting result as 3 instead of 3.5. So you can try to save the result in a float data type. like

float result = (1 3 4-7 9 11) /6

Hope this answers your question...

  • Related