当前位置: 首页 > news >正文

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 编写一个函数&#xff0c;计算两个SHA256哈希码中不同bit的数目。&#xff08;参考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&#xff0c;找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7…...

设计模式—策略模式

目录 一、定义 二、特点 三、优点 四、缺点 五、实例 六.涉及到的知识点 1、一个类里面有哪些东西&#xff1f; 2、类和实例 什么是类&#xff1f; 什么是实例&#xff1f; 什么是实例化&#xff1f; 3、字段和属性 什么是字段&#xff1f; 属性是什么&#xff1…...

LPDDR4、DDR4

核心信息&#xff1a; 2400Mbps&#xff08;每秒传输2400*1百万bit&#xff09; 2400MT/s&#xff08;百万次/秒&#xff09; 信号...

ESP32C3 LuatOS RC522①写入数据并读取M1卡

LuatOS RC522官方示例 官方示例没有针对具体开发板&#xff0c;现以ESP32C3开发板为例。 选用的RC522模块 ESP32C3-CORE开发板 注意ESP32C3的 SPI引脚位置&#xff0c;SPI的id2 示例代码 -- LuaTools需要PROJECT和VERSION这两个信息 PROJECT "helloworld" VERSIO…...

MusicBrainz Picard for Mac :音乐文件ID3编辑器

MusicBrainz Picard for Mac是一款macOS平台的音乐文件ID3编辑器&#xff0c;能够帮助我们在Mac电脑上编辑音乐文件的ID3标签信息&#xff0c;包括艺人、专辑等信息&#xff0c;非常快速和简单方便。Picard是下一代MusicBrainz标记应用程序。 这个新的标签概念是面向专辑的&…...

❤ Uniapp使用

❤ Uniapp使用 一、介绍 uni-app官网&#xff1a;https://uniapp.dcloud.io/api/media/image?idpreviewimage 微信小程序官网&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.previewImage.html 二、使用 1、uniapp 实现图片预览 单图预…...

解密Spring事务生效的内部机制

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

大数据时代下的数据安全防护

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

RabbitMQ-常用命令

RabbitMQ常用命令 3.1 启动停止rabbitMQ命令 # 前台启动Erlang VM 和 RabbitMQ 当窗口关闭或者ctrlc时&#xff0c;使退出了。 rabbitmq-server# 使用系统命令启动 systemctl start rabbitmq-server# 后台启动 rabbitmq-server -detached# 停止rabbitMQ和Erlang VM rabbitmq-…...

Spring中依赖注入的继承bean的细节问题

介绍 有时我们会对一种类型的bean进行继承&#xff0c;在Spring生成bean的时候&#xff0c;返回类型有时是子类类型&#xff0c;有时会父类类型。那么到底在什么情况下用哪种类型呢&#xff1f;肯定有不少人会忽略这点&#xff0c;本篇文章就是把这个细节讲清楚 案例 父类Ba…...

海外腾讯云服务器手机上无法访问外网怎么办??

本文将介绍腾讯云服务器无法访问外网的一些常见原因以及解决办法&#xff0c;同时解答了手机无法访问腾讯云服务器的问题。 腾讯云服务器&#xff08;Tencent Cloud Server&#xff09;是一种基于云计算技术的虚拟服务器&#xff0c;可以满足用户对于计算、存储、网络等方面的需…...

python3+requests:接口自动化测试(二)

前言&#xff1a;上篇文章python3requestsunittest&#xff1a;接口自动化测试&#xff08;一&#xff09;&#xff1a;已经介绍了基于unittest框架的实现接口自动化&#xff0c;但是也存在一些问题&#xff0c;比如最明显的测试数据和业务没有区分开&#xff0c;接口用例不便于…...

uni-app:允许字符间能自动换行(英文字符、数字等)

<template><view class"container"><!-- 这里是你的文本内容 -->{{ multilineText }}</view> </template><style> .container {word-break: break-all; } </style>例如&#xff1a; <template><view class"…...

day 42 |● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 dp数组需要记录两种状态&#xff0c;一种是当天时手中还持有股票&#xff0c;一种是当天时手中已卖出股票。 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基础入门理论(超基础)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…...

(三)行为模式:7、观察者模式(Observer Pattern)(C++示例)

目录 1、观察者模式&#xff08;Observer Pattern&#xff09;含义 2、观察者模式的UML图学习 3、观察者模式的应用场景 4、观察者模式的优缺点 &#xff08;1&#xff09;优点&#xff1a; &#xff08;2&#xff09;缺点 5、C实现观察者模式的实例 1、观察者模式&…...

2019CVPR Semantic Graph Convolutional Networks for 3D Human Pose Regression

基于语义图卷积网络的三维人体姿态回归 源码 https://github.com/garyzhao/SemGCN 摘要 在本文中&#xff0c;我们研究了学习图卷积网络&#xff08;GCN&#xff09;回归的问题。GCN的当前体系结构受限于卷积滤波器和共享的变换矩阵为的小感受野。为了解决这些限制&#xff…...

大数据课程K16——Spark的梯度下降法

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解Spark的梯度下降法&#xff1b; ⚪ 了解Spark的梯度下降法家族&#xff08;BGD&#xff0c;SGD&#xff0c;MBGD&#xff09;&#xff1b; ⚪ 掌握Spark的MLlib实现…...

避坑指南:ThingsBoard部件开发中5个常见错误与优化方案(附跑马灯Demo代码)

ThingsBoard部件开发实战&#xff1a;5个高频踩坑点与性能优化技巧&#xff08;含跑马灯完整实现&#xff09; 最近在技术社区看到不少开发者讨论ThingsBoard部件开发中的"玄学问题"——明明按照文档操作却出现各种诡异现象。作为经历过完整产品开发周期的技术负责人…...

从LTE到5G-Advanced:载波聚合(CA)技术演进全解析与网络工程师调试指南

从LTE到5G-Advanced&#xff1a;载波聚合技术深度演进与实战调试手册 当你在凌晨三点的基站机房盯着屏幕上跳动的KPI指标&#xff0c;突然发现某个5G小区下行速率始终无法突破800Mbps——这很可能是一个典型的载波聚合配置问题。作为网络优化工程师&#xff0c;我们每天都在与这…...

别再只用3x3卷积了!手把手教你为YOLOv8定制任意形状的卷积核(AKConv保姆级教程)

突破传统卷积限制&#xff1a;AKConv在YOLOv8中的创新实践 卷积神经网络&#xff08;CNN&#xff09;作为计算机视觉领域的基石&#xff0c;其核心组件卷积操作的设计直接影响着模型性能。传统33卷积虽然广泛应用&#xff0c;但在处理非规则形状目标时存在明显局限性。本文将深…...

WSL2下git clone失败:防火墙与代理配置全解析

1. WSL2下git clone失败的常见现象 最近在WSL2环境下工作时&#xff0c;突然发现git clone命令无法正常拉取远程仓库代码。这个问题困扰了我好几天&#xff0c;经过反复排查才发现是Windows防火墙设置和代理配置的问题。相信很多使用WSL2开发的同行都遇到过类似情况&#xff1…...

RWKV7-1.5B-g1a开源模型实战:轻量级AI助手在中小企业的落地

RWKV7-1.5B-g1a开源模型实战&#xff1a;轻量级AI助手在中小企业的落地 1. 模型简介 rwkv7-1.5B-g1a 是一个基于 RWKV-7 架构的多语言文本生成模型&#xff0c;专为中小企业设计的轻量级AI助手解决方案。这个1.5B参数的模型在保持较小体积的同时&#xff0c;提供了足够强大的…...

MAX7319 GPIO输入扩展库:硬件边沿检测与中断驱动实践

1. 项目概述iotec_MAX7319 是一款面向嵌入式系统的轻量级 C 驱动库&#xff0c;专为 Maxim Integrated&#xff08;现属 Analog Devices&#xff09;推出的 IC 接口 GPIO 扩展芯片 MAX7319 设计。该芯片并非通用型端口扩展器&#xff0c;而是一款带可屏蔽边沿检测功能的专用输入…...

让 TDengine 在 JetBrains IDEs 里更像“原生数据库”一点

让 TDengine 在 JetBrains IDEs 里更像“原生数据库”一点 Author: ChangJin Wei (魏昌进) 最近我做了一个小插件&#xff0c;把 TDengine 接入到了 JetBrains IDEs 的数据库工具链里。 先埋个小提示&#xff1a;文末有彩蛋。 项目地址&#xff1a; GitHub: https://github.…...

LLM大模型开发实战:6个爆款开源项目,小白也能轻松入门!

本文介绍了6个GitHub上的热门LLM&#xff08;大型语言模型&#xff09;开源项目&#xff0c;包括Datawhale的"LLM-Universe"和"LLM-Cookbook"、微软的"Generative AI for Beginners"、mlabonne的"LLM-Course"、liguodongiot的"LL…...

LeetCode 102. Binary Tree Level Order Traversal 题解

LeetCode 102. Binary Tree Level Order Traversal 题解 题目描述 给你二叉树的根节点 root&#xff0c;返回其节点值的 层序遍历。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输…...

告别龟速下载!一个Shell脚本搞定GFZ非潮汐大气负载数据(附站点坐标文件模板)

极速批量获取GFZ非潮汐大气负载数据的Shell脚本实战指南 在GNSS数据处理和地球物理研究中&#xff0c;获取高精度的非潮汐大气负载(NTAL)数据是分析站点位移的关键环节。德国地学研究中心(GFZ)作为全球权威机构&#xff0c;其提供的NTAL数据产品被广泛应用于科研和工程领域。然…...