JS算法题目1

//定义价格区间
let arr = [
  {count:100,price:99},
  {count:500,price:90},
  {count:1000,price:85},
  {count:2000,price:78},
  {count:3000,price:74}
]
//购买数量
let count = 800;

//要求输出:{count:500,price:90},因为800在500-1000之间,所以返回500的价格。

有如上一个若干长度的数组,定义了起订量和对应的价格区间,

  • 买100-499件,单价为99。
  • 买500-999件,单价为90。
  • 买1000-1999件,单价为85。
  • 买2000-2999件,单价为78。
  • 买大于3000件,单价为74

求JS算法。

阅读 4.4k
6 个回答

var prices=arr.filter((item)=>{
return item.count<800
})

prices返回所有小于800的数组 你可以取出里面count最大值 或者排序取出第一个或者最后一个
或者先排序再过滤

arr.sort((a, b)=> b.count - a.count).find(item=> item.count < 800)

先按count倒序排列,然后查找

如果输入的数组是按照count增序的话,那么可以用二分法,复杂度logN

var prices=arr.filter((item)=>{
return 800/item.count>1&&800/item.count<2
})

因为这样的区间不可能太多,所以都没有必要使用过于复杂的算法,只要能保证数据是单调的,采用依次遍历的方式就可以很快得出查询结果。

注意,这是针对某种确定的商品类型的查询。

此外还有起批量的概念,比如这里就是100件,低于的提示不批发出售(没有对应价格)。

//Arr 是预先排好序的价格区间数组
// 返回值为-1表示没有查询到价格
var FindPrices=function(Arr,Count){
    if(Arr.length<1) return -1;
    let AL=Arr.length;
    if(Arr[0]["count"]>Count) return -1;
    for(let i=AL-1;i>=0;i--){
        if(Arr[i]["count"]<=Count) return Arr[i]["price"]
    }
    return -1;
}
const find = (arr, count = 800) => {
      let mark = 0;
      for (let item of arr) {
        if (item.count === count) return item.count;
        if (count > mark && count < item.count) {
          return mark
        }
        mark = item.count;
      }
    }
    console.log(find(arr, 1500))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏