1-1 统计数字问题

news2024/11/25 4:44:50

 

题目:

 我的答案:

一、信息

 

二、分析

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.哈希表和红黑树学到了新的用法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络协议详解】——DHCP系统协议(学习笔记)

目录 &#x1f552; 1. DHCP概述&#x1f552; 2. 工作过程&#x1f552; 3. DHCP的报文格式&#x1f552; 4. DHCP中继代理&#x1f552; 5. 实验&#xff1a;DHCP配置 &#x1f552; 1. DHCP概述 动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&…

TA-lib第三方库安装问题

因为学习的需要&#xff0c;用到Talib库做写指标分析&#xff0c;但是百度了好久&#xff0c;说是去要某某网站下载对应版本的文件进行本地安装&#xff0c;但是把…404 Not found 然后通过查找&#xff0c;Ta-lib库的安装已经迁移到这里了 https://github.com/TA-Lib/ta-lib-p…

【SpringBoot教程】SpringBoot+MybatisPlus数据库连接测试 用户收货信息接口开发

⛪ 专栏地址 系列教程更新中 &#x1f680; 文章介绍: SpringBootMybatisPlus组合可以大大加快开发效率&#xff0c;紧接上一篇文章的内容&#xff0c;这篇文章进行数据库的连接与查询测试&#xff0c;并配置日志输出调试 &#x1f680; 源码获取: 项目中的资料可以通过文章底部…

数据安全治理科技系统能力-数据安全复合治理框架和模型解读(3)

数据治理,数据安全治理行业在发展,在实践,所以很多东西是实践出来的,哪有什么神仙理论指导,即使有也是一家之说,但为了提高企业投产比,必要的认知是必须的,落地数据安全治理科技水平差异直接决定产品和项目是否可持续性,当前和未来更需要专业和有效创新。数据安全治理…

《数据库》期末考试复习手写笔记-第11章 并发控制(锁)【10分】

目录 知识点&#xff1a;封锁活锁死锁可串行化调度 考题1&#xff1a;可串行化调度 考题2&#xff1a;调度正确判断&共享锁写锁 考题3&#xff1a; 事务调度死锁 知识点&#xff1a;封锁活锁死锁可串行化调度 考题1&#xff1a;可串行化调度 考题2&#xff1a;调度正确判…

杨立昆:科学之路读书笔记2

杨立昆&#xff1a;科学之路读书笔记2 人工智能的低谷人工智能无所不能吗&#xff1f;谁将从AI人工智能革命中获益结语 一起学AI系列博客&#xff1a;目录索引 人工智能的低谷 上回分享了读书缘由&#xff0c;杨立昆的背景及其对人工智能的研究看法&#xff0c;这回分享他如何…

15.Kafka系列之事务原理及实践

我们先来回顾下6.Kafka系列之设计思想(四)-消息传递语义中的一些内容 1. 消息传递保证 At most once&#xff1a;最多一次。消息可能会丢失&#xff0c;但永远不会重新传递At least once&#xff1a;至少一次。消息永远不会丢失&#xff0c;但可能会重新传递Exactly once&…

rust 初识基础: 变量、数据类型、函数、所有权、枚举

了解到 rust 和 WebAssembly 的结合使用&#xff0c;可以构建前端应用&#xff0c;而且性能也比较好。初步学习使用 rust 是预编译静态类型语言。 安装 rust 官网下载 rust-CN , 大致了解下为什么选择&#xff1a;高性能、可靠性、生产力。 打开控制台啊&#xff0c;执行安装…

【Servlet】

目录 &#x1f382;1. 第一个 Servlet 程序&#xff1a;使用 Servlet 写 hello world &#x1f95e;1.1 创建项目 &#x1f373;1.2 引入依赖 &#x1f383;1.3 创建目录 &#x1f358;1.4 开始写代码 &#x1f30d;1.5 打包代码 &#x1f364;1.6 部署 &#x1f451;1…

如何在华为OD机试中获得满分?Java实现【获取最大软件版本号】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

使用kotlin用回溯法解决电话号码的字母组合问题

17. 电话号码的字母组合 难度中等 2474 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#…

23种设计模式中之中介者模式(Mediator Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的迭代器模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬…

运维工程师面试总结(含答案)

运维工程师面试总结 原文链接&#xff1a;https://www.cuiliangblog.cn/detail/article/2 一、linux 1. linux系统启动流程 第一步&#xff1a;开机自检&#xff0c;加载BIOS第二步&#xff1a;读取&#xff2d;&#xff22;&#xff32;第三步&#xff1a;Boot Loader grub…

uni-app常用场景速查记录

记录一下uniapp开发过程中遇到的问题场景,方便后期查看. 1.elementUI中textarea文本如何设置换行显示 2.uniapp中实现文字滚动显示 3.下拉刷新和触底分页查询 1.elementUI中textarea文本设置换行显示 el-input标签中type为textarea中录入的文本内容,在表格中显示…

关键词搜索1688商品数据采集、1688商品列表数据接口

1688&#xff1a;指中国最大的电子商务综合平台&#xff0c;类似于美国的亚马逊。 关键词&#xff1a;是用于描述检索文档或记录的词语或短语&#xff0c;通常是用户输入的查询信息。 搜索&#xff1a;是在数据库、网页搜索引擎或其他信息存储库中查找信息内容的过程。 商品数…

springboot+springsecurity+jwt+elementui图书管理系统

​​图书管理系统​​ 关注公号&#xff1a;java大师&#xff0c;回复“图书”&#xff0c;获取源码 一、springboot后台 1、mybatis-plus整合 1.1添加pom.xml <!--mp逆向工程 --><dependency><groupId>org.projectlombok</groupId><artifactId&…

腾讯云服务器可用区是什么意思?可用区详细说明

腾讯云服务器可用区什么意思&#xff1f;可用区&#xff08;Zone&#xff09;是指腾讯云在同一地域内电力和网络互相独立的物理数据中心&#xff0c;一个可用区故障不会影响另一个可用区的正常运行&#xff0c;所以可用区用于构建高容灾、高可靠性应用。腾讯云服务器网来详细说…

华为OD机试真题B卷 Java 实现【食堂供餐】,附详细解题思路

一、题目描述 某公司员工食堂以盒饭的方式供餐。 为将员工取餐排队时间降为0&#xff0c;食堂的供餐速度必须要足够快。 现在需要根据以往员工取餐的统计信息&#xff0c;计算出一个刚好能达到排队时间为0的最低供餐速度。 即&#xff0c;食堂在每个单位时间内必须至少做出…

分布式事务的21种武器 - 7

在分布式系统中&#xff0c;事务的处理分布在不同组件、服务中&#xff0c;因此分布式事务的ACID保障面临着一些特殊难点。本系列文章介绍了21种分布式事务设计模式&#xff0c;并分析其实现原理和优缺点&#xff0c;在面对具体分布式事务问题时&#xff0c;可以选择合适的模式…

Rocketmq学习之路(一)从生产上的问题引出MQ

前言&#xff1a; 从来没有真正弄明白mq是什么&#xff0c;只知道他有消峰&#xff0c;异步&#xff0c;解耦的作用。但是在日常开发工作中&#xff0c;就是简单的生产者发送消息&#xff0c;消费者接受消息。所以&#xff0c;从今天开始。我要吃掉这个技术。 一.这该死的订单…