1-1 统计数字问题

 

题目:

 我的答案:

一、信息

 

二、分析

1.如何选择数据结构?

2.如何选择算法有很多思路?
3.如何用文件实现输入输出?

三、思考

疑问1

我选择了一开始数组选择使用数组是一个不错的选择,尤其在这个问题中,因为我们需要统计数字0到9在页码中出现的次数。

使用数组可以方便地记录每个数字的出现次数。我们可以创建一个长度为10的整数数组,索引从0到9,分别表示数字0到9。通过遍历页码并根据每个页码的数字来更新相应数字在数组中的计数。

优点:
- 数组具有固定的大小,可以直接使用索引进行访问,查找和更新操作的时间复杂度是常数级别的,非常高效。
- 在这个问题中,数字0到9的范围是固定的,因此使用数组可以直接映射数字到数组的索引,使得代码实现简单明了。

然而,需要注意的是,如果输入范围超出了数字0到9,或者需要处理更大范围的数字,使用固定大小的数组可能不再适用。在这种情况下,可以考虑其他数据结构,如哈希表(HashMap)或红黑树(Red-Black Tree),以动态地处理更大范围的数字。

怎么解决这个问题呢?

如果书的页数范围在1到10的九次方(1到1,000,000,000)之间,那么使用数组作为数据结构可能会导致内存占用过大,因为需要创建一个长度为10的十亿级别的数组。

在这种情况下,使用固定大小的数组将不再是一个合适的选择。相反,可以考虑使用动态数据结构来处理更大范围的数字。

一种可行的方法是使用哈希表(HashMap)或类似的键值对存储结构。哈希表可以根据键(数字)快速查找和更新对应的值(出现次数)。通过将数字作为键,将其出现次数作为值,可以有效地统计数字在页码中的出现次数。

优点:
- 哈希表可以动态调整大小,根据需要分配内存,因此可以适应大范围的数字。
- 在平均情况下,哈希表的插入、查找和更新操作的时间复杂度是常数级别的,因此仍然具有高效性能。

在使用哈希表时,将每个页码转换为字符串并遍历其每个字符的方法仍然适用。然后,使用哈希表来存储数字的计数,最后将统计结果写入输出文件。

综上所述,对于页数范围在1到10的九次方的问题,使用哈希表作为数据结构是更好的选择。它能够有效地处理大范围的数字,并提供高效的查找和更新操作。

疑问2 如何用算法实现页数的统计呢?

我的想法1是通过把n位数进行拆分个位十位百位...然后统计,遇到同样的字符串我们就可以对变量++,这是遍历的思想

我的想法2是通过寻找背后的数学规律然后找到数学式子然后求解,这比较考验编程者的数学水平。

最终的思路是选择迭代遍历即第一个

疑问3 如何用文件实现文件的输入输出?

要使用文件实现题目中的输入输出功能,可以按照以下步骤进行操作:

1. 输入文件处理:
   - 在代码中使用 `fopen` 函数打开输入文件,指定文件名和打开模式(如 `"r"`)。
   - 使用 `fscanf` 或 `fgets` 函数从输入文件中读取数据,将其存储到适当的变量中。
   - 关闭输入文件,使用 `fclose` 函数关闭文件句柄。

2. 输出文件处理:
   - 在代码中使用 `fopen` 函数打开输出文件,指定文件名和打开模式(如 `"w"`)。
   - 使用 `fprintf` 函数将要输出的数据写入输出文件。
   - 关闭输出文件,使用 `fclose` 函数关闭文件句柄。

下面是一个示例代码,演示了如何使用文件实现输入和输出功能:


#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;

    // 读取输入文件
    FILE* inputFile = fopen("input.txt", "r");
    if (inputFile == NULL) {
        printf("无法打开输入文件\n");
        return 1;
    }
    fscanf(inputFile, "%d", &n);
    fclose(inputFile);

    // 进行数字统计操作
    // ...

    // 将结果写入输出文件
    FILE* outputFile = fopen("output.txt", "w");
    if (outputFile == NULL) {
        printf("无法打开输出文件\n");
        return 1;
    }
    fprintf(outputFile, "统计结果\n");
    // 输出结果
    // ...
    fclose(outputFile);

    return 0;
}

在这个示例中,代码使用了 `fopen` 函数打开输入文件和输出文件。使用 `fscanf` 函数从输入文件中读取一个整数 `n`,并使用 `fprintf` 函数将统计结果写入输出文件。

请注意,使用文件进行输入输出需要确保输入文件和输出文件存在,并且程序对文件的访问权限是允许的。

四、具体实现步骤思路计划

传统的流程图:
开始

├─ 打开输入文件
│  ├─ 若文件打开失败,则输出错误信息,结束程序
│  └─ 读取输入数据
│     ├─ 若读取失败,则输出错误信息,结束程序
│     └─ 关闭输入文件

├─ 分配数字计数器的内存空间
│  ├─ 若内存分配失败,则输出错误信息,结束程序
│  └─ 初始化数字计数器

├─ 数字统计
│  └─ 循环直到 n 为 0
│     ├─ 取 n 的个位数字
│     └─ 将对应的数字计数器加一
│     └─ 更新 n 为 n 的除以 10 的商

├─ 打开输出文件
│  ├─ 若文件打开失败,则输出错误信息,释放内存,结束程序
│  └─ 将数字统计结果写入输出文件
│     ├─ 循环遍历数字计数器
│     └─ 将每个数字的计数写入输出文件

└─ 关闭输出文件

结束

五、代码实现

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int digit;
    int count;
} DigitCount;

void countDigits(int n, DigitCount* counts) {
    while (n > 0) {
        int digit = n % 10;
        counts[digit].count++;
        n /= 10;
    }
}

int main() {
    int n;
    FILE* inputFile = fopen("input.txt", "r");
    if (inputFile == NULL) {
        printf("无法打开输入文件\n");
        return 1;
    }
    fscanf(inputFile, "%d", &n);
    fclose(inputFile);

    DigitCount* counts = (DigitCount*)calloc(10, sizeof(DigitCount));
    if (counts == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    countDigits(n, counts);

    FILE* outputFile = fopen("output.txt", "w");
    if (outputFile == NULL) {
        printf("无法打开输出文件\n");
        free(counts);
        return 1;
    }
    for (int i = 0; i < 10; i++) {
        fprintf(outputFile, "%d\n", counts[i].count);
    }
    fclose(outputFile);

    free(counts);

    return 0;
}

六、正确答案

 七、反思总结

我有什么不足?

1.C语言文件学的一坨大便得赶紧捡起来

2.哈希表也忘了怎么实现了就知道有这回事还得翻书。

我学到了什么?
1.文件实现输入输出如何实现

2.多种处理这种问题的思路

3.哈希表和红黑树学到了新的用法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/26054.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vulnhub dc-8

1.信息搜集 端口 22,80,31337 存活ip 192.168.85.136 2.访问网站&#xff0c;进行信息搜集 在欢迎页面发现sql注入 sqlmap进行跑数据 python sqlmap.py -u "http://192.168.85.136/?nid1" --batch -D d7db -T users -C name,pass --dump尝试robots.txt,发现后他登…

生成程序片段(程序依赖图PDG)

生成程序片段(程序依赖图PDG) 生成程序片段 标准方法是&#xff1a; 基于依赖性分析的切片。 使用程序依赖图表示依赖。 从中生成切片。 我们将专注于这种方法。但是&#xff0c;还有其他选择。 程序依赖图 The Program Dependence Graph (PDG) 表示数据和控制依赖项&#xf…

《深入理解计算机系统(CSAPP)》第7章 链接 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习CSAPP时的个人笔记&#xff0c;分享出来与大家学习交流&#xff0c;目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记&#xff0c;在复习回看时发现部分内容存在一些小问题&#xff0c;因时间紧张来不及再次整理…

java单元测试( Hamcrest 断言)

java单元测试( Hamcrest 断言) 单元测试特征: 1 范围狭窄 2 限于单一类或方法 3 体积小 为什么要编写单元测试&#xff1f; 为了防止错误&#xff08;很明显&#xff01;&#xff09; 而且还可以提高开发人员的生产力&#xff0c;因为单元测试&#xff1a; (1) 帮助实施——在…

力扣sql中等篇练习(二十八)

力扣sql中等篇练习(二十八) 1 每个城市最高气温的第一天 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below SELECT w.city_id,MIN(w.day) day,w.degree FROM Weather w INNER JOIN (SELECT city_id,MAX(degr…

【算法学习系列】07 - 无序数组中的局部最小值问题

文章目录 说明约束条件简单说下思路解决方案随机无序数组样本生成器算法实现验证代码进行大样本随机测试验证算法正确性 说明 在算法中&#xff0c;局部最小值是指一个函数在一个局部范围内的最小值。 具体而言&#xff0c;如果一个函数在一个小区间内的取值都比该区间内的其他…

C++程序员的待遇怎么样?我来谈谈学好C++的五个关键点

有个学弟跟我谈到这样一个问题&#xff1a;现在我看到网上很多人都在讲&#xff0c;说这个做C程序员&#xff0c;尤其是本科毕业计算机专业&#xff0c;然后步入社会之后就能拿到月入过万。但是为什么自己找的这个工作啊&#xff0c;普遍在月薪六七千块钱左右&#xff0c;也就是…

利用OpenCV处理图像

OpenCV是非常流行的图像处理库&#xff0c;下面介绍一下其对图像的基本操作。 1. 安装与环境 安装还有点儿复杂的&#xff0c;但百度几篇博客基本能解决&#xff0c;这里就不多说了。 安装好后&#xff0c;要在工程中使用OpenCV的头文件和库&#xff0c;需要在CMakeLists.tx…

码住!IC设计常用工具合集!

芯片设计过程中&#xff0c;选择和使用适合的工具是非常重要的。芯片设计工具通常分为三类&#xff1a;EDA工具、模拟仿真工具和布局工具。 一、EDA工具 EDA工具是芯片设计的核心&#xff0c;它包括原理图绘制、逻辑综合、门级仿真工具和物理版图编辑等&#xff0c;可以帮助设计…

基于springboot+Redis的前后端分离项目(一)-【黑马点评】

&#x1f381;&#x1f381;资源文件分享 链接&#xff1a;https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码&#xff1a;eh11 基于session和redis实现登录 &#xff08;一&#xff09;前言&#xff08;二&#xff09;导入资源&#xff08;三&#xff09;短信…

每日学术速递5.26

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Text2NeRF: Text-Driven 3D Scene Generation with Neural Radiance Fields 标题&#xff1a;Text2NeRF&#xff1a;具有神经辐射场的文本驱动 3D 场景生成 作者&#xff1a;Jingb…

Python程序设计基础:标识符、变量与赋值、输入输出

文章目录 一、标识符二、变量与赋值三、输入输出 一、标识符 Python对每个标识符的命名存在要求&#xff1a; 1、每个标识符必须以字母或下划线“_”开头&#xff0c;后跟字母、数字或下划线的任意序列。根据这个规则&#xff0c;以下都是Python中的合法名称&#xff1a;a&…

史上最全测试开发工具推荐(含自动化、性能、稳定性、抓包)

目录 一、UI自动化测试工具 1. uiautomator2 2. Appium 3. ATX-Test 4. Airtest 5. ATXServer2 6. STF 7. Appetizer 二、APP稳定性测试工具 8. UICrawler 9. Maxim 10. AppCrawler 三、APP性能测试工具 11. SoloPi 12. GT 四、抓包工具 13. AnyProxy 14. mi…

【滤波】设计卡尔曼滤波器

本文主要翻译自rlabbe/Kalman-and-Bayesian-Filters-in-Python的第8章节08-Designing-Kalman-Filters&#xff08;设计卡尔曼滤波器&#xff09;。 %matplotlib inline#format the book import book_format book_format.set_style()简介 在上一章节中&#xff0c;我们讨论了教…

【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版)

ChatGLM-6B模型结构代码解析(单机版) ​ 本文介绍ChatGLM-6B的模型结构&#xff0c;代码来自https://huggingface.co/THUDM/chatglm-6b/blob/main/modeling_chatglm.py。 相关博客 【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版) 【自然语言处理】【大模型】BL…

枚举_源码_分析

枚举源码分析 前言 这是所有Java语言枚举类型的公共基类。关于枚举的更多信息&#xff0c;包括编译器合成的隐式声明方法的描述&#xff0c;可以在Java的第8.9节中找到™ 语言规范。 请注意&#xff0c;当使用枚举类型作为集合的类型或映射中键的类型时&#xff0c;可以使用专…

斩获阿里offer,这份258页面试宝典也太顶了....

测试三年有余&#xff0c;很多新学到的技术不能再项目中得到实践&#xff0c;同时薪资的涨幅很低&#xff0c;于是萌生了跳槽大厂的想法 但大厂不是那么容易进的&#xff0c;前面惨败字节&#xff0c;为此我辛苦准备了两个月&#xff0c;又从小公司开始面试了半个月有余&#…

最系统的网络安全自学笔记+学习路线(超详细)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

虚拟机类加载机制

目录 1、概述 2、类加载的过程 1、过程总览 2、加载 3、链接-验证 4、链接-准备 5、链接-解析 6、初始化 7、总结 3、类加载的时机 4、类加载器 1、概述 2、类与类加载器 3、三层类加载器 4、双亲委派模型 5、其他加载策略 1、概述 一个Java类会被编译成一个Cl…

游戏封包加密方案解析

当下游戏市场已全面回暖&#xff0c;暑期档临近更将迎来大量新游上线&#xff0c;如此关键节点&#xff0c;游戏厂商应当更加注重游戏安全。 FairGuard发现近期游戏黑灰产攻击角度愈发刁钻&#xff0c;除了常见的内存修改外挂、注入挂&#xff0c;针对游戏封包破解的「脱机挂」…