关于算法:算法训练营数值计算篇

5次阅读

共计 2139 个字符,预计需要花费 6 分钟才能阅读完成。

1. 将一个指定整数值等分成指定的数量,最终返回这个能被等分的整数值

  /**
   * @param {Number}
   * @return {Number}
   */  
function intervalHandle (num, num_interval) {if (indexOfHandle(num, num_interval)) {return num} else {for (var i = 0; i <= num_interval; i++) {
          var num_new = num
              num_new += i;
          if (indexOfHandle(num_new, num_interval)) {return num_new}
        }
      }
      function indexOfHandle(x, y) {return String((x / y)).indexOf('.') === -1
      }
  }
  intervalHandle(1999, 10) // =>  2000
  // intervalHandle(给定的值, 要等分的个数)
  // 利用场景:图表 x / y 轴计算最大值和距离值 

2. 判断一个数是不是质数 / 素数

概念:

  • 质数又称素数。一个大于 1 的自然数,除了 1 和它本身外,不能被其余自然数整除的数叫做质数;否则称为合数。
  • 0 和 1 既不是质数也不是合数,最小的质数是 2

     /**
       * @param {Number}
       * @return {Number}
       */  
    function isPrime(num) {if (num <= 3) return n > 1
      let sqrt = parseInt(Math.sqrt(num))
      for (let i = 2; i <= sqrt; i++) {if (num % i === 0) {return false}
      }
      return true
    }
    console.log(isPrime(10)) // => false

    3. 计算两个数字之间的间断值(输出 1,4 => 输入 1,2,3,4)

function continuousValue(numStart,numEnd){let a=parseInt(numStart);
      let b=parseInt(numEnd);
      let c = [];
      if (numStart - b < 0) {const number = Math.abs(a - b) + 1;
        for (let i = a; i < a + number; i++) {c.push(i);
        }
      } else if (a - b === 0) {c.push(a)
      } else if (a - b > 0) {const number = Math.abs(a - b);
        for (let i = a; i > number; i--) {c.push(i);
        }
      }
      return c.join(',');
    }
    continuousValue(1,5) // => '1,2,3,4,5'

4. 计算一组数值中每个数值的占比(百分比 %)

/**
 * @description: 占比算法(最大余额法)* @param {Array} valueList 要计算的数组
 * @param {index} idx 要计算数组中值的下表
 * @param {number} precision 百分比保留几位小数
 */
function getPercentValue(valueList, idx, precision) {if (!valueList[idx]) {return 0;}
  var sum = valueList.reduce(function(acc, val) {return acc + (isNaN(val) ? 0 : val);
  }, 0);
  if (sum === 0) {return 0;}
  var digits = Math.pow(10, precision);
  var votesPerQuota = valueList.map(function(val) {return (isNaN(val) ? 0 : val) / sum * digits * 100;
  });
  var targetSeats = digits * 100;
  // 再向下取值,组成数组
  var seats = votesPerQuota.map(function(votes) {return Math.floor(votes);
  });
  var currentSum = seats.reduce(function(acc, val) {return acc + val;}, 0);
  var remainder = votesPerQuota.map(function(votes, idx) {return votes - seats[idx];
  });
  while (currentSum < targetSeats) {
      var max = Number.NEGATIVE_INFINITY;
      var maxId = null;
      for (var i = 0, len = remainder.length; i < len; ++i) {if (remainder[i] > max) {max = remainder[i];
              maxId = i;
          }
      }
      // 对最大项余额加 1
      ++seats[maxId];
      remainder[maxId] = 0;
      ++currentSum;
  }
  // 总数占比 100%
  return seats[idx] / digits;
}

// 调用
let a = [1,2]
let result = [];
a.forEach((v, i) => {result.push(getPercentValue(a, i, 0))
});
console.log(result) // [33, 67]
正文完
 0