算法学习日记 | 枚举

🧠 算法学习日记 | 今天我用「枚举」解了三道题,原来简单也能很优雅!

大家好,我是你们的算法学习搭子 👋

今天继续我的算法入门之旅,重点练习了**枚举(Brute Force)**这一基础但极其重要的方法。

很多人觉得"枚举=暴力=低效",但其实,在数据规模可控的情况下,枚举是最可靠、最直观的解题方式。更重要的是------它能帮你快速验证思路是否正确!

今天我完整做了三道题,每一道都坚持用最朴素的枚举方法解决。下面我把题目原文我的原始代码原封不动贴出来,不做任何删减或美化,只为真实记录学习过程。


🔹 题目一:特别数的和

题目描述

小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。

请问,在 1 到 n 中,所有这样的数的和是多少?
输入描述

输入格式:

输入一行包含一个整数 n ((( 1 \\leq n \\leq 10\^4 )。
输出描述

输出一行,包含一个整数,表示满足条件的数的和。
输入输出样例

复制代码
输入
49

输出
574

运行限制

  • 最大运行时间:1s
  • 最大运行内存:256M

✅ 我的代码

cpp 复制代码
#include <iostream>
using namespace std;

bool f(int x){
    while(x){
        int y=x%10;
        if(y==2 || y==0 || y==1 || y==9){
            return true;
        }
        x/=10;
    }
    return false;
}

int main()
{
    int n;
    cin>>n;
    int sum=0;
    for(int i=1;i<=n;i++){
        if(f(i)){
            sum+=i;
        }
    }
    cout<<sum;
    return 0;
}

🔹 题目二:反倍数

题目描述

给定三个整数 a, b, c ,如果一个整数既不是 a 的整数倍也不是 b 的整数倍还不 是 c 的整数倍,则这个数称为反倍数。

请问在 1 至 n 中有多少个反倍数。
输入描述

输入的第一行包含一个整数 n

第二行包含三个整数 a, b, c ,相邻两个数之间用一个空格分隔。其中,,相邻两个数之间用一个空格分隔。 其中,,相邻两个数之间用一个空格分隔。其中, 1 \\leq n \\leq 1000000 ,,, 1 \\leq a \\leq n ,,, 1 \\leq b \\leq n ,,, 1 \\leq c \\leq n
输出描述

输出一行包含一个整数,表示答案。
输入输出样例

复制代码
输入
36
2 3 6

输出
10

样例说明

以下这些数满足要求:1, 5, 7, 11, 13, 17, 19, 23, 25, 29。
运行限制

  • 最大运行时间:1s
  • 最大运行内存:256M

✅ 我的代码

cpp 复制代码
#include <iostream>
using namespace std;

int a,b,c;
bool f(int x){
    if(x%a!=0 && x%b!=0 && x%c!=0)
        return true;
    else
        return false;
}

int main()
{
    int n;
    cin>>n;
    cin>>a>>b>>c;
    int count=0;
    for(int i=1;i<=n;i++){
        if(f(i)){
            count++;
        }
    }
    cout<<count;
    return 0;
}

🔹 题目三:找到最多的数

问题描述

在一个 n \\times m 的矩阵中,有一个数字出现了超过一半的次数,请设计一个高效算法找到这个数字。
输入格式

输入第一行包含两个整数 n m ,表示矩阵的大小(,表示矩阵的大小(,表示矩阵的大小( 1 \\leq n, m \\leq 10\^3 )。

接下来 n 行,每行包含 m 个正整数,表示矩阵中的元素。
输出格式

输出一个整数,表示矩阵中出现次数超过一半的数字。
样例输入

复制代码
3 3
1 2 3
2 2 2
1 2 2

样例输出

复制代码
2

运行限制

语言 最大运行时间 最大运行内存
C++ 1s 256M
C 1s 256M
Java 2s 256M
Python3 3s 256M
PyPy3 3s 256M
Go 3s 256M
JavaScript 3s 256M

✅ 我的代码

cpp 复制代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

map<int,int> mp;

int main()
{
    int m,n;
    cin>>m>>n;
    for(int i=1;i<=n*m;i++){
        int a;
        cin>>a;
        mp[a]++;
    }
    for(const auto &i:mp){
        if(2*i.second>n*m){
            cout<<i.first;
        }
    }
    return 0;
}

🌟 我的思考

这三道题,我全部使用了枚举的思想:

  • 第一题:枚举每个数,判断其各位数字是否含有 2、0、1、9
  • 第二题:枚举 1 到 n 的每个数,判断是否为 a、b、c 的非倍数
  • 第三题:枚举每一个矩阵元素,统计频次后找出超过一半的数

虽然没有使用高级技巧(如数学公式、位运算、投票算法等),但枚举让我把问题拆解得非常清晰。只要逻辑正确,就能通过测试。

而且我发现:很多题目看似复杂,其实核心就是"遍历 + 判断"。当你能把枚举写对,就已经赢了一半。


✅ 总结

  • 枚举不是"低端",而是"基础"
  • 题目描述要读准,边界条件要抠细
  • 代码可以简陋,但逻辑必须严谨
  • 先求正确,再求高效

如果你也在刷算法题,不妨试试今天这三道题,用最直白的枚举方法做一遍。

有时候,慢一点,反而更快。

欢迎在评论区贴出你的解法,我们一起交流进步!👇


相关推荐
iAkuya12 小时前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
近津薪荼12 小时前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck12 小时前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
松☆12 小时前
CANN与大模型推理:在边缘端高效运行7B参数语言模型的实践指南
人工智能·算法·语言模型
_F_y12 小时前
C++重点知识总结
java·jvm·c++
java干货12 小时前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
皮皮哎哟12 小时前
数据结构:嵌入式常用排序与查找算法精讲
数据结构·算法·排序算法·二分查找·快速排序
程序员清洒12 小时前
CANN模型剪枝:从敏感度感知到硬件稀疏加速的全链路压缩实战
算法·机器学习·剪枝
敏叔V58712 小时前
AI智能体的工具学习进阶:零样本API理解与调用
人工智能·学习
vortex513 小时前
几种 dump hash 方式对比分析
算法·哈希算法