GO语言圣经 第四章习题
练习4.1
编写一个函数,计算两个SHA256哈希码中不同bit的数目。(参考2.6.2节的PopCount函数。)
func PopCount(ptr *[32]byte) int {var res intfor i := 0; i < 32; i++ {x := int(ptr[i])for x != 0 {res += x & 1x >>= 1}}return res
}
练习4.2
编写一个程序,默认情况下打印标准输入的SHA256编码,并支持通过命令行flag定制,输出SHA384或SHA512哈希算法。
package mainimport ("bufio""crypto/sha256" //!+"crypto/sha512""flag""fmt""os"
)var n = flag.Int("n", 256, "SHA param")func main() {flag.Parse()var s stringinput := bufio.NewScanner(os.Stdin)for input.Scan() {s += input.Text()}switch *n {case 256:fmt.Printf("%x", sha256.Sum256([]byte(s)))case 384:fmt.Printf("%x", sha512.Sum384([]byte(s)))case 512:fmt.Printf("%x", sha512.Sum512([]byte(s)))}
}
练习4.3
重写reverse函数,使用数组指针代替slice。
func reverse(s *[6]int) {for i, j := 0, len(*s)-1; i < j; i, j = i+1, j-1 {s[i], s[j] = s[j], s[i]}
}
练习4.4
编写一个rotate函数,通过一次循环完成旋转。
func rotate(s []int, ind int) {out := make([]int, cap(s)-ind)copy(out, s[ind:])for i := 0; i < ind; i++ {out = append(out, s[i])}copy(s, out)
}
练习4.5
写一个函数在原地完成消除[]string中相邻重复的字符串的操作。
func nonrepeat(strings []string) []string {i := 0for j := range strings {if j != 0 && strings[j] == strings[j-1] {continue} else {strings[i] = strings[j]i++}}return strings[:i]
}
练习4.6
编写一个函数,原地将一个UTF-8编码的[]byte类型的slice中相邻的空格(参考unicode.IsSpace)替换成一个空格返回
func nonrepeat(s []byte) []byte {for j := 0; j < len(s); j++ {if j != 0 && unicode.IsSpace(rune(s[j])) && s[j] == s[j-1] {copy(s[j-1:], s[j:])s = s[:len(s)-1]j--}}return s
}
练习4.7
修改reverse函数用于原地反转UTF-8编码的[]byte。是否可以不用分配额外的内存?
不能不分配额外的内存,byte需要转为rune,否则会出现乱码
func reverse(s []byte) []rune {r := []rune(string(s))for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {r[i], r[j] = r[j], r[i]}return r
}
练习4.8
修改charcount程序,使用unicode.IsLetter等相关的函数,统计字母、数字等Unicode中不同的字符类别。
package mainimport ("bufio""fmt""io""os""unicode""unicode/utf8"
)func main() {counts := make(map[rune]int) // counts of Unicode charactersvar utflen [utf8.UTFMax + 1]int // count of lengths of UTF-8 encodingsinvalid := 0 // count of invalid UTF-8 charactersvar utftype [3]intin := bufio.NewReader(os.Stdin)for {r, n, err := in.ReadRune() // returns rune, nbytes, errorif err == io.EOF {break}if err != nil {fmt.Fprintf(os.Stderr, "charcount: %v\n", err)os.Exit(1)}if r == unicode.ReplacementChar && n == 1 {invalid++continue}switch {case unicode.IsLetter(r):utftype[0]++case unicode.IsDigit(r):utftype[1]++default:utftype[2]++}counts[r]++utflen[n]++}fmt.Printf("rune\tcount\n")for c, n := range counts {fmt.Printf("%q\t%d\n", c, n)}fmt.Print("\nlen\tcount\n")for i, n := range utflen {if i > 0 {fmt.Printf("%d\t%d\n", i, n)}}fmt.Print("\ntype\tcount\n")for i, n := range utftype {switch i {case 0:fmt.Print("letter:")case 1:fmt.Print("digit:")case 2:fmt.Print("other:")}fmt.Println(n)}if invalid > 0 {fmt.Printf("\n%d invalid UTF-8 characters\n", invalid)}
}
练习4.9
编写一个程序wordfreq程序,报告输入文本中每个单词出现的频率。在第一次调用Scan前先调用input.Split(bufio.ScanWords)函数,这样可以按单词而不是按行输入。
func wordfreq() {counts := make(map[string]int)in := bufio.NewScanner(os.Stdin)in.Split(bufio.ScanWords)for in.Scan() {counts[in.Text()]++}for k, v := range counts {fmt.Println("%s %d\n", k, v)}
}
练习4.10
修改issues程序,根据问题的时间进行分类,比如不到一个月的、不到一年的、超过一年。
package mainimport ("fmt""log""os""time""gopl.io/ch4/github"
)func main() {//now 为现在的时间,yearAgo 为距现在一年的时间,monthAgo 为距现在一月的时间。now := time.Now()yearAgo := now.AddDate(-1, 0, 0)monthAgo := now.AddDate(0, -1, 0)//三个切片,用来存储 不足一个月的问题,不足一年的问题,超过一年的问题。yearAgos := make([]*github.Issue, 0)monthAgos := make([]*github.Issue, 0)noMonthAgos := make([]*github.Issue, 0)result, err := github.SearchIssues(os.Args[1:])if err != nil {log.Fatal(err)}fmt.Printf("%d issues:\n", result.TotalCount)for _, item := range result.Items {if yearAgo.After(item.CreatedAt) {yearAgos = append(yearAgos, item)} else if monthAgo.After(item.CreatedAt) {monthAgos = append(monthAgos, item)} else if monthAgo.Before(item.CreatedAt) {noMonthAgos = append(noMonthAgos, item)}}fmt.Printf("\n一年前\n")for _, item := range yearAgos {fmt.Printf("#%-5d %9.9s %.55s\n",item.Number, item.User.Login, item.Title)}fmt.Printf("\n一月前\n")for _, item := range monthAgos {fmt.Printf("#%-5d %9.9s %.55s\n",item.Number, item.User.Login, item.Title)}fmt.Printf("\n不足一月\n")for _, item := range noMonthAgos {fmt.Printf("#%-5d %9.9s %.55s\n",item.Number, item.User.Login, item.Title)}
}
相关文章:
GO语言圣经 第四章习题
练习4.1 编写一个函数,计算两个SHA256哈希码中不同bit的数目。(参考2.6.2节的PopCount函数。) func PopCount(ptr *[32]byte) int {var res intfor i : 0; i < 32; i {x : int(ptr[i])for x ! 0 {res x & 1x >> 1}}return res }练习4.2 编…...
远程连接Ubuntu 22.04
远程连接Ubuntu 22.04 安装openssh-server sudo apt install openssh-server检查服务运行状态 systemctl status sshd重启服务状态 sudo systemctl restart ssh开启防火墙 sudo ufw enable开启ssh传输端口 sudo ufw allow ssh设置开机启动服务 sudo systemctl enable ssh配置服…...

字节前端实习的两道算法题,看看强度如何
最长严格递增子序列 题目描述 给你一个整数数组nums,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7…...

设计模式—策略模式
目录 一、定义 二、特点 三、优点 四、缺点 五、实例 六.涉及到的知识点 1、一个类里面有哪些东西? 2、类和实例 什么是类? 什么是实例? 什么是实例化? 3、字段和属性 什么是字段? 属性是什么࿱…...

LPDDR4、DDR4
核心信息: 2400Mbps(每秒传输2400*1百万bit) 2400MT/s(百万次/秒) 信号...

ESP32C3 LuatOS RC522①写入数据并读取M1卡
LuatOS RC522官方示例 官方示例没有针对具体开发板,现以ESP32C3开发板为例。 选用的RC522模块 ESP32C3-CORE开发板 注意ESP32C3的 SPI引脚位置,SPI的id2 示例代码 -- LuaTools需要PROJECT和VERSION这两个信息 PROJECT "helloworld" VERSIO…...

MusicBrainz Picard for Mac :音乐文件ID3编辑器
MusicBrainz Picard for Mac是一款macOS平台的音乐文件ID3编辑器,能够帮助我们在Mac电脑上编辑音乐文件的ID3标签信息,包括艺人、专辑等信息,非常快速和简单方便。Picard是下一代MusicBrainz标记应用程序。 这个新的标签概念是面向专辑的&…...
❤ Uniapp使用
❤ Uniapp使用 一、介绍 uni-app官网:https://uniapp.dcloud.io/api/media/image?idpreviewimage 微信小程序官网:https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.previewImage.html 二、使用 1、uniapp 实现图片预览 单图预…...

解密Spring事务生效的内部机制
声明式事务和编程式事务对比: 声明式事务: 使用注解或XML配置的方式,在代码中声明事务的属性和行为。通过AOP和代理模式实现,将事务管理与业务逻辑代码解耦。适用于大多数情况,简化了代码,提高了可维护性和…...

大数据时代下的数据安全防护
随着大数据时代的来临,数据安全防护成为了一个重要的问题。在大数据时代,数据的规模和价值都得到了极大的提升,因此数据安全的重要性也变得越来越突出。本文将从数据加密、访问控制、网络安全和人员管理四个方面来介绍大数据时代下的数据安全…...

RabbitMQ-常用命令
RabbitMQ常用命令 3.1 启动停止rabbitMQ命令 # 前台启动Erlang VM 和 RabbitMQ 当窗口关闭或者ctrlc时,使退出了。 rabbitmq-server# 使用系统命令启动 systemctl start rabbitmq-server# 后台启动 rabbitmq-server -detached# 停止rabbitMQ和Erlang VM rabbitmq-…...
Spring中依赖注入的继承bean的细节问题
介绍 有时我们会对一种类型的bean进行继承,在Spring生成bean的时候,返回类型有时是子类类型,有时会父类类型。那么到底在什么情况下用哪种类型呢?肯定有不少人会忽略这点,本篇文章就是把这个细节讲清楚 案例 父类Ba…...
海外腾讯云服务器手机上无法访问外网怎么办??
本文将介绍腾讯云服务器无法访问外网的一些常见原因以及解决办法,同时解答了手机无法访问腾讯云服务器的问题。 腾讯云服务器(Tencent Cloud Server)是一种基于云计算技术的虚拟服务器,可以满足用户对于计算、存储、网络等方面的需…...

python3+requests:接口自动化测试(二)
前言:上篇文章python3requestsunittest:接口自动化测试(一):已经介绍了基于unittest框架的实现接口自动化,但是也存在一些问题,比如最明显的测试数据和业务没有区分开,接口用例不便于…...

uni-app:允许字符间能自动换行(英文字符、数字等)
<template><view class"container"><!-- 这里是你的文本内容 -->{{ multilineText }}</view> </template><style> .container {word-break: break-all; } </style>例如: <template><view class"…...
day 42 |● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II
121. 买卖股票的最佳时机 dp数组需要记录两种状态,一种是当天时手中还持有股票,一种是当天时手中已卖出股票。 func maxProfit(prices []int) int {dp : make([][]int, len(prices))dp[0] []int{-prices[0], 0}for i : 1; i < len(prices); i{val0…...
SQLserver基础入门理论(超基础)
♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏…...

(三)行为模式:7、观察者模式(Observer Pattern)(C++示例)
目录 1、观察者模式(Observer Pattern)含义 2、观察者模式的UML图学习 3、观察者模式的应用场景 4、观察者模式的优缺点 (1)优点: (2)缺点 5、C实现观察者模式的实例 1、观察者模式&…...

2019CVPR Semantic Graph Convolutional Networks for 3D Human Pose Regression
基于语义图卷积网络的三维人体姿态回归 源码 https://github.com/garyzhao/SemGCN 摘要 在本文中,我们研究了学习图卷积网络(GCN)回归的问题。GCN的当前体系结构受限于卷积滤波器和共享的变换矩阵为的小感受野。为了解决这些限制ÿ…...

大数据课程K16——Spark的梯度下降法
文章作者邮箱:yugongshiyesina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Spark的梯度下降法; ⚪ 了解Spark的梯度下降法家族(BGD,SGD,MBGD); ⚪ 掌握Spark的MLlib实现…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...