青训营题目之154 小c的点菜问题| 豆包MarsCode AI 刷题

48 阅读2分钟

问题描述

小C来到了一家餐馆,准备点一些菜。

已知该餐馆有 n 道菜,第 i 道菜的售价为 w(w随着 i 的变化而变化)。

小C准备点一些价格相同的菜,但小C不会点单价超过 m 的菜。

小C想知道,自己最多可以点多少道菜?

整体思路分析

  1. 首先判断菜的售价,将符合条件的菜单放入一个数组当中
  2. 之后再统计其中相同价格菜品最多的价格
  3. 该售价则为小c能点的最多的菜

注意事项

  1. 要看清题目,要统计的是相同价格并且单价小于m的菜品,而不是单价小于m的菜品。

  2. 在得出相同的单价的菜品数量时,记录每次菜品的数量num在每次的循环结束后要记得初始化,否则第二种单价的数量为第一种单价的数量加上第一种单价数量,导致出错。倘若num想从1开累加,则在for循环中则i不能等于j即可。

具体代码

  1. 首先判断菜的单价,利用for循环来将符合条件的菜放入一个vector数组当中
 vector<int> a;
    for(char A:w)
    {
        if(A<=m)
        {
            a.push_back(A);
        }
    }
  1. 再来利用两个for循环统计其中相同价格最多的菜品的单价,其中需先判断各种单价菜品的数量,再来将这些数量进行对比,从而得出最多的相同价格的菜品数量。每次num的即为相同单价的菜品数量,再将num与max进行判断即可得出num的最大值
int max=0;
    for(int i=0;i<a.size();i++)
    {
        int num = 0;
        for(int j=0;j<a.size();j++)
        {
            if(a[i]==a[j])
            {
                num++;
            }
        }
        max=max<num?num:max;
    }
  1. 该菜品数量则为小c能点的最多的菜品数量,返回其的值即可
return max;

感悟

这个问题需要对于问题逻辑有着清晰的认识,主要体现在如何高效地统计相等元素的个数,处理连续相等的元素以及边界问题的处理。在统计相同单价菜品数量时,我使用了两个for循环,时间复杂程度较高,可以去寻找一些更加简单的方法来求解。同时,数组为空与数组为1的情况需要特殊处理,返回0。通过这个题目,使我的思维能力得到了锻炼,对于初始化数据的不同情况有了进一步的了解。