餐厅过滤器问题

2020-05-27  本文已影响0人  多喝热开水

继续没事刷leetcode ,是时候到了培养自信的时候了,终于遇到了一个简单的算法问题
看到这么个题目:

餐厅过滤器
给你一个餐馆信息数组 restaurants,其中 restaurants[i] = [idi, ratingi, veganFriendlyi, pricei, distancei]。你必须使用以下三个过滤器来过滤这些餐馆信息。

其中素食者友好过滤器 veganFriendly 的值可以为 true 或者 false,如果为 true 就意味着你应该只包括 veganFriendlyi 为 true 的餐馆,为 false 则意味着可以包括任何餐馆。此外,我们还有最大价格 maxPrice 和最大距离 maxDistance 两个过滤器,它们分别考虑餐厅的价格因素和距离因素的最大值。

过滤后返回餐馆的 id,按照 rating 从高到低排序。如果 rating 相同,那么按 id 从高到低排序。简单起见, veganFriendlyi 和 veganFriendly 为 true 时取值为 1,为 false 时,取值为 0 。

示例 1:

输入:restaurants = [[1,4,1,40,10],[2,8,0,50,5],[3,8,1,30,4],[4,10,0,10,3],[5,1,1,15,1]], veganFriendly = 1, maxPrice = 50, maxDistance = 10
输出:[3,1,5] 
解释: 
这些餐馆为:
餐馆 1 [id=1, rating=4, veganFriendly=1, price=40, distance=10]
餐馆 2 [id=2, rating=8, veganFriendly=0, price=50, distance=5]
餐馆 3 [id=3, rating=8, veganFriendly=1, price=30, distance=4]
餐馆 4 [id=4, rating=10, veganFriendly=0, price=10, distance=3]
餐馆 5 [id=5, rating=1, veganFriendly=1, price=15, distance=1] 
在按照 veganFriendly = 1, maxPrice = 50 和 maxDistance = 10 进行过滤后,我们得到了餐馆 3, 餐馆 1 和 餐馆 5(按评分从高到低排序)。 

示例 2:

输入:restaurants = [[1,4,1,40,10],[2,8,0,50,5],[3,8,1,30,4],[4,10,0,10,3],[5,1,1,15,1]], veganFriendly = 0, maxPrice = 50, maxDistance = 10
输出:[4,3,2,1,5]
解释:餐馆与示例 1 相同,但在 veganFriendly = 0 的过滤条件下,应该考虑所有餐馆。

终于遇到了个感觉上很简单的题目了,关键是它的标注还是道 难度中等的题目

image.png
这不给他刷了高兴一下先
先分析一波:
其实题目本身很简单,就是过滤器,先过滤是否素食,然后过滤价格和距离,最后再排序啊,兄弟们,被打击的自信终于可以找回来了!
直接上代码: 兄弟们,继续老样子,leetcode 没有OC啊,果断还是先用JS代替下
var filterRestaurants = function(restaurants, veganFriendly, maxPrice, maxDistance) {
    
    let result = restaurants;
    // 先过滤素食者
    if (veganFriendly) {
        result = restaurants.filter(function(n) {
            if (n[2] == true) {
                return true;
            }
            return false;
        });
    }
    
    // 过滤价格和距离
    result = result.filter(function(n) {
            let flag = false;
            if (n[3] <= maxPrice && n[4] <= maxDistance) {
                return true;
            }
            return false;
        });

    // 开始排序 先rating 高到低 相同则id高到低
    result.sort(function(a,b){
        // 降序排列
        if (b[1] != a[1]) {
            return b[1]-a[1];    //升序
        }
        return b[0]-a[0]; // 升序
    });
  
  // 最后再把餐厅的id展示出来
    var retsultId = result.map(function(x){
        return x[0];
    });
    return retsultId;
};

一通操作成功完成,点击提交看看:


image.png

完美,这道题目很简单啊,感觉配不上他上面显示的难度,感觉是个简单的题目。
做完了之后常规反思一下啊,不对劲啊,这感觉像是有优化的空间啊,
1.过滤素食者
2.过滤价格和距离
3.开始排序 先rating 高到低 相同则id高到低
4.展示餐厅的id
感觉上 1,2 可以合并一起过滤,简单合并后再来:

var filterRestaurants = function(restaurants, veganFriendly, maxPrice, maxDistance) {
    let result = restaurants;
    // 过滤素食者 价格和距离
    var result = restaurants.filter(item => {
         return (item[2] == veganFriendly || veganFriendly == 0) && (item[3] <= maxPrice) && (item[4] <= maxDistance);
    });

    // 开始排序 先rating 高到低 相同则id高到低
    result.sort(function(a,b){
        // 降序排列
        if (b[1] != a[1]) {
            return b[1]-a[1];    //升序
        }
        return b[0]-a[0];
    });
    var retsultId = result.map(function(x){
        return x[0];
    });
    return retsultId;
};

好了,大致上就是这样解决一个简单的过滤器问题。

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/filter-restaurants-by-vegan-friendly-price-and-distance

上一篇下一篇

猜你喜欢

热点阅读