• 力扣469A


    1. 题目链接

    I Wanna Be the Guy

    2. 题目代码

    #include
    #include
    using namespace std;
    int main(){
        int highestLevelOfGame;
        cin >> highestLevelOfGame;
    
        set<int> levelCanPass;
    
        int levelOfXPass;
        cin >> levelOfXPass;
        int level;
        while(levelOfXPass --){
            cin >> level;
            levelCanPass.insert(level);
        }
    
        int levelOfYPass;
        cin >> levelOfYPass;
        while(levelOfYPass --){
            cin >> level;
            levelCanPass.insert(level);
        }
        
        if(levelCanPass.size() == highestLevelOfGame){
            cout << "I become the guy.";
        }else{
            cout << "Oh, my keyboard!";
        }
    
        return 0;
    }
    

    3. 题目总结

    用时:31min
    卡住原因:审题不清 – 以为整个第二行都是X可以通过的等级,第三行都是Y可以通过的等级,从而认为第二、三的数据个数无法判断。于是想到用string类型的数据获取二、三行数据(考虑到有空格,输入方式应该采用getline(cin, 字符串名) )。接下来的代码实现我考虑了两个方案:① 使用双重for循环。第一层循环遍历游戏的等级(1-n),第二层循环遍历X、Y可以通过的等级。看看是否X、Y是否包含1到n的所有数值。② 单重循环。但是要把X、Y字符串里的所有数据先整合到一个set容器里。

    4. 代码分析

    参照代码来源:
    在这里插入图片描述
    注:set.count()

    #include 
    #include 
    
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
    
        set<int> x_levels, y_levels;
    
        int p;
        cin >> p;
        for (int i = 0; i < p; ++i) {
            int level;
            cin >> level;
            x_levels.insert(level);
        }
    
        int q;
        cin >> q;
        for (int i = 0; i < q; ++i) {
            int level;
            cin >> level;
            y_levels.insert(level);
        }
    
        bool can_pass_all_levels = true;
        for (int i = 1; i <= n; ++i) {
            if (!(x_levels.count(i) || y_levels.count(i))) {
                can_pass_all_levels = false;
                break;
            }
        }
    
        if (can_pass_all_levels) {
            cout << "I become the guy." << endl;
        } else {
            cout << "Oh, my keyboard!" << endl;
        }
    
        return 0;
    }
    

    我的代码耗时:78ms
    内存占用:0KB

    问:为什么人家的代码比我多了一个for循环,但是比我的耗时还少?
    答(回复来自gpt):
    代码比对:
    ① 输入处理方式:
            参考代码:通过明确读取 p 和 q 的值来确定循环次数,然后每次循环分别读取并插入到两个不同的 set 中。
            我的代码:使用了 while 循环来处理输入,但没有显式地指定循环次数,而是依赖 levelOfXPass 和 levelOfYPass 变量来控制循环次数。这种方式可能在输入处理上引入了更多的复杂性和可能的性能开销。
    集合操作:
    ② 集合操作:
            参考代码:在判断是否可以通过所有关卡时,通过遍历从 1 到 n 的整数来检查每个关卡是否在 x_levels 或 y_levels 中。
            我的代码:通过比较 levelCanPass 集合的大小和 highestLevelOfGame 的值来判断是否可以通过所有关卡。这种方法简化了判断逻辑,但在集合操作上,需要考虑集合的插入和去重操作的性能开销。
    性能差异的可能原因:
    ① 输入操作效率:
            我的代码的输入处理方式可能会比第一段代码更复杂,尤其是在处理大量输入时,可能会影响整体性能。
    ② 集合操作效率:
            虽然两者都使用了 set 数据结构,但集合的插入操作可能受到输入量的影响。特别是我的代码中的 insert 操作可能需要更多的内部重排或重新哈希,这可能会导致性能略微下降。
    优化建议:
            简化输入处理逻辑,减少不必要的数据结构操作,以及选择更适合具体应用场景的数据结构和算法。

  • 相关阅读:
    fastadmin笔记,fastadmin表格功能
    Linux 系统垃圾日志清理
    web网页设计期末课程大作业 HTML+CSS+JavaScript 美食餐饮文化主题网站设计 学生DW静态网页设计
    关于PMP考试免费重考,你想知道的都在这
    flink技术总结待续
    【开发工具套件与Web图表工具】上海道宁为您带来Visual Paradigm工具软件,推动IT项目的开发与成功
    数据库去重(MYSQL和ORACLE)
    thinkPhp5返回某些指定字段
    在服务中无法正常启动Nacos
    自动化运维工具——ansible概述和部署
  • 原文地址:https://blog.csdn.net/m0_62024160/article/details/139814601