【问题标题】:Find two values in array where a given number is between在给定数字之间的数组中查找两个值
【发布时间】:2021-01-14 07:55:40
【问题描述】:

我有一个带有数字的数组,但它们可以是唯一的,并且数字会改变,但现在,让我们假设它是这样的:

const arr = [200, 180, 150, 120, 80];

我有一个数组的平均值:

const average = 146;

我需要一个函数来检查这个平均数需要在数组中的两个数字之间的位置,在这种情况下,在 150 到 120 之间,然后才显示一些东西等。我该如何实现呢?

我目前的进度,但这并没有给出我需要的输出:

let array = [200, 180, 150, 120, 80];

const sum = array.reduce(function(a, b){
    return a + b;
}, 0);

const average = sum / array.length; // 146

let check = (arr: any[], start: number, end: number, value: number) => (
    start <= end ?
    arr.filter((_, i) => i >= start && i <= end) :
    arr.filter((_, i) => i >= start || i <= end)
).includes(value);

console.log('check', check(array, 120, 150, average)); // 120 and 150 must be found in function as these values can't be hardcoded and will change

期望的结果:如果平均数介于这两个数字之间,则显示此文本等。如何做到这一点?

【问题讨论】:

  • 数组是否总是以相同的方式预先排序?总是下降还是上升?
  • 总是降序。 @sbgib

标签: javascript arrays


【解决方案1】:

假设

  • 数组已排序。

条件

  • 检查它是否小于数组中的当前元素并且大于数组中的下一个元素。

注意:如果数组没有排序,你可以Array.sort()

const arr = [200, 180, 150, 120, 80];

let sum = arr.reduce((acc, x) => {
  return acc + x
}, 0)

let avg = sum / arr.length;

for (let i = 0; i < arr.length - 1; i++) {

  if (avg < arr[i] && avg > arr[i + 1]) {
    console.log("Here at indice " + (i + 1) + " is " + avg + "'s place");
  }

}

【讨论】:

    【解决方案2】:

    使用findIndex 方法。 (内联 cmets)

    const getIndexesBound = (arr, avg) => {
      const index = arr.findIndex((num) => avg > num);
      if (index < 1) {
        // when index 0 means first element
        // when index -1, can not find num
        return "Can not find indexes bound";
      } else {
        return [index - 1, index];
      }
    };
    
    
    const arr = [200, 180, 150, 120, 80];
    
    console.log('Bound indexes for 146', getIndexesBound(arr, 146));

    【讨论】:

      【解决方案3】:

      试试这样:

      let array = [200, 180, 150, 120, 80];
      
      const sum = array.reduce(function(a, b) {
        return a + b;
      }, 0);
      
      const average = sum / array.length; // 146
      
      
      let check = (arr, start, end, value) => {
        let istart = array.indexOf(start);
        let iend = array.indexOf(end);
        let iaverage = 0;
      
        if (istart === -1 || iend === -1) {
          return null;
        };
      
        for (var i = istart; i <= iend; i++) {
          if (arr[i] <= average) {
            return i;
          };
        };
        
        return null;
      };
      
      console.log('check', check(array, 150, 120, average)); // 120 and 150 must be found in function as these values can't be hardcoded and will change

      最简单的方法是在startend 的位置之间循环并检查平均值适合的位置。

      【讨论】:

        【解决方案4】:

            let numArr = [200, 180, 150, 120, 80];
            
            const calcAvg = arr => arr.reduce((acc, cur) => acc += cur, 0) / numArr.length;
            
            const isAvgPlace = (arr, start, end, avg) => {
                let sorted = [...arr].sort((a,b) => a - b);
                let avgPlace = sorted.filter((cur, i) => avg <= cur && sorted[i+1] >= avg);
                return avgPlace[0] === start && avgPlace[1] === end;
            }
        
            const average = calcAvg(numArr);
            console.log(isAvgPlace(numArr, 150, 180, average));
            console.log(isAvgPlace(numArr, 120, 150, average));

        P.S:请使用有意义的名称来命名变量、函数等。使用像 arraycheck 这样的通用名称会降低可读性并且是一种不好的做法。

        【讨论】:

          【解决方案5】:

          const array = [200, 180, 150, 120, 80];
              
              const check = (array,a,b)=>{
              
                //copy array
                const arrayClone = [...array];
                //sum copy array
                const sum = arrayClone.reduce(function(a, b){
                    return a + b;
                }, 0);
                //average copy array
                const average = sum / arrayClone.length;
              
                //adding to an copy array
                arrayClone.push(average);
              
                //sort copy array
                arrayClone.sort(function(a, b) {
                  return b-a;
                });
                // take the index of the push number
                const index = arrayClone.indexOf(average);
              
                // check that the average number is between the two numbers given
                if((arrayClone[index-1]===a)&&(arrayClone[index+1]===b)){
                  // if ok
                  console.log(arrayClone.slice(index-1,index+2))
                }else{
                  console.log("not found")
                }
              
              }
              
              check(array,150,120);

          【讨论】:

            猜你喜欢
            • 2022-11-03
            • 2012-01-12
            • 2018-08-28
            • 1970-01-01
            • 2022-08-22
            • 2015-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多