Advertisement

【Go 语言入门 100 题】第 003 题:个位数统计 (15 分) - Go 语言(Golang).docx

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:DOCX


简介:
本文档为《Go 语言入门 100 题》系列的第三题,内容涉及编写一个程序来统计给定整数中的每一位数字出现次数。题目难度为中等,旨在帮助初学者掌握基本编程技巧和算法逻辑。通过此练习,学习者能够加深对 Go 语言语法及标准库的理解与应用。 ### Go 语言入门题目解析:个位数统计 #### 题目背景与目标 本题目选自《Go 语言入门 100 题》,编号为 L1-003,难度评级为 15 分。题目要求实现一个程序来统计一个不超过 1000 位的大整数中各个不同个位数出现的频率,并按照数字从小到大的顺序输出这些个位数及其出现次数。 #### 输入输出要求 **输入格式:** - 每个测试用例由一行不超过 1000 位的正整数组成。 **输出格式:** - 对于每个不同的个位数字 D,输出该数字及其在输入中的出现次数 M,格式为 `D:M`。 - 输出按照数字 D 的升序排列。 **示例:** - **输入样例:** `100311` - **输出样例:** ``` 0:2 1:3 3:1 ``` #### 解题思路 1. 将输入的大整数视为字符串,便于逐个字符地处理。 2. 使用 Go 语言中的 `map` 数据结构来存储每个个位数及其出现次数。这里使用 `rune` 类型作为键(Go 语言中用于表示单个字符的数据类型),因为大整数可能包含多位数字,而每个数字由单个字符表示。 3. 创建一个新的整型数组来存储实际出现的个位数字。 4. 使用 Go 语言中的排序函数对包含实际出现的个位数的数组进行排序,并按照排序后的顺序输出。 #### 实现代码 ```go package main import ( fmt sort ) func main() { var str string k := make(map[rune]int) // 初始化 map 以存储个位数及其出现次数 _, _ = fmt.Scan(&str) for _, item := range str { k[item]++ } keys := make([]int, 0, len(k)) for k1 := range k { keys = append(keys, int(k1)) // 将实际出现的个位数字添加到整型数组中 } sort.Ints(keys) for _, item := range keys { fmt.Printf(%d:%d\n, item, k[rune(item)]) } } ``` ### 代码解析 1. **初始化 Map**:使用 `make` 函数初始化 `map[rune]int` 类型的 `k`,其中 `rune` 表示字符,`int` 表示该字符的出现次数。 2. **读取输入**:使用 `fmt.Scan` 从标准输入读取字符串。 3. **遍历字符串并统计**:使用 `for` 循环遍历字符串中的每个字符,并更新 `map` 中对应的值。 4. **创建并填充整型数组**:遍历 `map` 的键,将实际出现的个位数字添加到整型数组 `keys` 中。 5. **排序**:使用 `sort.Ints()` 对 `keys` 进行排序。 6. **输出结果**:再次遍历排序后的 `keys` 数组,并使用 `fmt.Printf` 打印每个个位数字及其出现次数。 通过以上步骤,我们能够有效地解决这个统计问题,并且符合题目要求的格式输出结果。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • Go 100 003 (15 ) - Go Golang).docx
    优质
    本文档为《Go 语言入门 100 题》系列的第三题,内容涉及编写一个程序来统计给定整数中的每一位数字出现次数。题目难度为中等,旨在帮助初学者掌握基本编程技巧和算法逻辑。通过此练习,学习者能够加深对 Go 语言语法及标准库的理解与应用。 ### Go 语言入门题目解析:个位数统计 #### 题目背景与目标 本题目选自《Go 语言入门 100 题》,编号为 L1-003,难度评级为 15 分。题目要求实现一个程序来统计一个不超过 1000 位的大整数中各个不同个位数出现的频率,并按照数字从小到大的顺序输出这些个位数及其出现次数。 #### 输入输出要求 **输入格式:** - 每个测试用例由一行不超过 1000 位的正整数组成。 **输出格式:** - 对于每个不同的个位数字 D,输出该数字及其在输入中的出现次数 M,格式为 `D:M`。 - 输出按照数字 D 的升序排列。 **示例:** - **输入样例:** `100311` - **输出样例:** ``` 0:2 1:3 3:1 ``` #### 解题思路 1. 将输入的大整数视为字符串,便于逐个字符地处理。 2. 使用 Go 语言中的 `map` 数据结构来存储每个个位数及其出现次数。这里使用 `rune` 类型作为键(Go 语言中用于表示单个字符的数据类型),因为大整数可能包含多位数字,而每个数字由单个字符表示。 3. 创建一个新的整型数组来存储实际出现的个位数字。 4. 使用 Go 语言中的排序函数对包含实际出现的个位数的数组进行排序,并按照排序后的顺序输出。 #### 实现代码 ```go package main import ( fmt sort ) func main() { var str string k := make(map[rune]int) // 初始化 map 以存储个位数及其出现次数 _, _ = fmt.Scan(&str) for _, item := range str { k[item]++ } keys := make([]int, 0, len(k)) for k1 := range k { keys = append(keys, int(k1)) // 将实际出现的个位数字添加到整型数组中 } sort.Ints(keys) for _, item := range keys { fmt.Printf(%d:%d\n, item, k[rune(item)]) } } ``` ### 代码解析 1. **初始化 Map**:使用 `make` 函数初始化 `map[rune]int` 类型的 `k`,其中 `rune` 表示字符,`int` 表示该字符的出现次数。 2. **读取输入**:使用 `fmt.Scan` 从标准输入读取字符串。 3. **遍历字符串并统计**:使用 `for` 循环遍历字符串中的每个字符,并更新 `map` 中对应的值。 4. **创建并填充整型数组**:遍历 `map` 的键,将实际出现的个位数字添加到整型数组 `keys` 中。 5. **排序**:使用 `sort.Ints()` 对 `keys` 进行排序。 6. **输出结果**:再次遍历排序后的 `keys` 数组,并使用 `fmt.Printf` 打印每个个位数字及其出现次数。 通过以上步骤,我们能够有效地解决这个统计问题,并且符合题目要求的格式输出结果。
  • Go面试Golang
    优质
    本书汇集了众多Go语言面试题目和解答,覆盖从基础语法到高级编程技巧等多个方面,旨在帮助读者准备Go语言相关的技术面试。 以下是关于Golang的面试题内容,请注意以下几点:确保答案准确无误;尽量使用简洁的语言表达复杂的概念;在回答问题的同时提供相应的代码示例以展示你的编程能力。这些问题涵盖了从基础语法到并发处理等多个方面,旨在全面考察应聘者的Go语言掌握程度和实际应用能力。
  • Go101:Golang指南
    优质
    《Go语言101:Golang入门指南》是一本专为初学者设计的教程,旨在帮助读者快速掌握Go语言的基础知识和编程技巧,轻松上手开发高效、可靠的后端服务。 《Go语言101》是一系列关于Go语言编程的丛书。
  • Go Golang)学习
    优质
    简介:本课程旨在帮助初学者掌握Go语言的核心概念和编程技巧,包括语法、并发处理及标准库使用,适合对后端开发感兴趣的程序员。 学习 Go 语言(Golang),通过简单易懂的教程让你快速掌握这门编程语言。
  • Go指南
    优质
    《Go语言入门指南》是一本专为编程新手设计的教程书籍,旨在通过简单易懂的方式介绍Go语言的基础知识、语法结构及应用开发技巧。 对于学习 Go 编程语言的爱好者来说,这本书无疑是最佳选择之一,它提供了最全面的学习资源。本书汇集了官方在线文档、名人博客文章、书籍以及演讲中的资料,并结合我在软件工程、编程语言和数据库开发方面的教学经验,将这些零散的知识点系统化地组织起来进行讲解。 我特别想向 Go 语言的开发者团队表示衷心感谢,尤其是其领导者 Rob Pike、Russ Cox 和 Andrew Gerrand。他们提供的示例和解释非常出色。同时也要感谢 Miek Gieben、Frank Muller、Ryanne Dolan 和 Satish V.J. 给予我的帮助,以及所有参与 Golang-nuts 邮件列表的成员们的支持与贡献。
  • Go学习资源:《Go程序设》《Go圣经》《Golang Web开发》及《学习Go》(PDF&Mobi格式)
    优质
    本资料包精选了四本高质量的Go语言学习书籍,《Go语言程序设计》、《Go语言圣经》、《Golang Web开发》以及《学习Go语言》,以PDF和Mobi两种格式提供,适合不同阅读设备。 Go语言学习的相关资源包括PDF格式和Kindle专用的MOBI格式文件。资料内容涵盖《Go语言程序设计》、《学习Go语言(Golang)》、《Go语言圣经》、《Go语言实战》以及《golang Web开发》等书籍。
  • GOGolang开发工具
    优质
    Go语言(简称Golang)的开发工具旨在为开发者提供高效的编程环境。这些工具涵盖代码编辑、调试及测试等各个方面,帮助用户充分利用Go语言的优势进行软件开发。 Go语言开发工具在Golang社区中有多种选择。这些工具有助于开发者提高编码效率、调试程序以及更好地管理项目结构。无论是初学者还是经验丰富的程序员,都可以找到适合自己的Go语言开发工具来优化他们的编程体验。
  • Go圣经:从到精通的Golang学习指南
    优质
    《Go语言圣经》是一本全面指导初学者至高级开发者掌握Golang编程技能的学习手册,内容涵盖语法基础、实战案例及性能优化等。 Go语言有时被描述为“C类似语言”或“21世纪的C语言”。它从C语言继承了相似的表达式语 法、控制流结构、基础数据类型、调用参数传值、指针等思想,以及编译后机器码运行效率和与现有操作系统的无缝适配。 Go项目包括编程语言本身及其相关工具和标准库。此外,它还包含了一套简洁编程哲学的宣言。从回顾的角度来看,Go在这些方面都做得不错:自动垃圾回收、包系统、函数作为一等公民、词法作用域、系统调用接口以及只读的UTF8字符串。然而,Go语言本身特性较少,并且不太可能增加太多新功能。例如,它没有隐式的数值转换、构造函数和析构函数、运算符重载、默认参数或继承机制;也没有泛型支持、异常处理、宏定义及线程局部存储等。 尽管如此,Go的语言核心是成熟稳定的,并承诺向后兼容:用之前的版本编写的程序可以用新版本的编译器和标准库直接构建而无需修改代码。 Go语言具有足够的类型系统以避免动态语言中的常见错误,但其类型系统相比传统强类型语言要简洁得多。 虽然有时候这会导致“无类”现象(即缺乏某些类型的定义),Go的设计理念之一是向C致敬,在保留高效性和系统级编程能力的同时改进了内存管理和安全性。它继承了C的表达式语法、控制流结构、基础数据类型和指针,但引入自动垃圾回收机制减轻程序员对内存管理的压力。 此外,Go强调编译后的机器码运行效率及与操作系统平台的紧密集成。 Go语言受到多门经典编程语言的影响,如Pascal、Modula-2 和 Oberon,并且其并发模型基于顺序通信进程(CSP)理论。 Go的一些其他特点包括: 1. **类型系统**:强大的类型系统防止动态语言中的常见错误,但比传统强类型语言更简洁。 2. **接口**:使用接口实现多态性而非传统的继承机制。 3. **函数作为一等公民**:可将函数赋值给变量、传递参数或返回结果。 4. **切片**:提供类似动态数组的功能,并支持高效随机访问。 5. **defer语句**:用于清理资源,确保无论函数是否正常结束都能执行特定代码。 6. **UTF-8字符串**: Go的字符串是只读且采用广泛认可的UTF-8编码。 Go语言没有很多高级特性,例如隐式类型转换、构造函数和析构函数、运算符重载、默认参数、继承机制、泛型支持及异常处理等。这种精简设计使Go更加稳定易懂,并保证向后兼容性。 此外,Go的工具链非常强大,包括`go build`(构建)、`go test`(测试)和`go fmt`(格式化代码)等功能。 总结而言,Go语言是一个平衡了效率、简洁性和并发编程特性的现代编程语言。它适合于高性能分布式系统和服务开发,在云服务、微服务架构及容器应用等领域中得到广泛应用。通过学习 Go 语言,开发者不仅可以掌握一种实用的工具,还可以深入了解并发编程和简洁哲学。
  • Go-构建区块链(级)
    优质
    《Go语言-构建区块链(入门级)》是一本指导初学者使用Go语言开发简单区块链应用的教程,适合对编程和区块链技术感兴趣的读者。 这是一段用Go语言编写的最简单的区块链创建代码,大约有100多行。它涵盖了创建区块链、新建创世区块以及向区块链中添加区块内容的功能。
  • Go依赖注——Wire
    优质
    Wire是一款用于Go语言的依赖注入工具,它能够自动生成依赖注入代码,简化了大型项目中的依赖管理,提高了开发效率。 最近在开发Golang框架时发现,尽管Go语言与Java不同,并且其标准库本身已经相当完善,但仍然需要类似Spring的IoC依赖注入框架来简化大型项目中的依赖管理。 对于较小规模的项目来说,是否使用依赖注入框架并不是关键问题。然而,在大规模应用中有一个合适的依赖注入工具将大大提升开发效率和代码可维护性。 在Golang生态系统里有许多流行的DI(Dependency Injection)库可供选择,比如`inject` 和 `dig`等。但本段落重点介绍的是`wire`,这是一个利用编译器进行依赖注入的框架。 好的,下面开始具体操作步骤: 首先添加以下依赖: ``` github.com/google/wire v0.3.0 ``` 然后编写如下示例代码(请注意原文中的语法错误,在定义结构体时逗号多余): ```go package main import ( fmt ) type apple struct { name string // 正确的字段声明,删除多余的逗号。 } ```