GO语言圣经 第四章习题

这篇具有很好参考价值的文章主要介绍了GO语言圣经 第四章习题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

练习4.1

编写一个函数,计算两个SHA256哈希码中不同bit的数目。(参考2.6.2节的PopCount函数。)

func PopCount(ptr *[32]byte) int {
	var res int
	for i := 0; i < 32; i++ {
		x := int(ptr[i])
		for x != 0 {
			res += x & 1
			x >>= 1
		}
	}
	return res
}

练习4.2

编写一个程序,默认情况下打印标准输入的SHA256编码,并支持通过命令行flag定制,输出SHA384或SHA512哈希算法。

package main

import (
	"bufio"
	"crypto/sha256" //!+
	"crypto/sha512"
	"flag"
	"fmt"
	"os"
)

var n = flag.Int("n", 256, "SHA param")

func main() {
	flag.Parse()
	var s string
	input := 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 := 0
	for 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 main

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"unicode"
	"unicode/utf8"
)

func main() {
	counts := make(map[rune]int)    // counts of Unicode characters
	var utflen [utf8.UTFMax + 1]int // count of lengths of UTF-8 encodings
	invalid := 0                    // count of invalid UTF-8 characters
	var utftype [3]int

	in := bufio.NewReader(os.Stdin)
	for {
		r, n, err := in.ReadRune() // returns rune, nbytes, error
		if 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程序,根据问题的时间进行分类,比如不到一个月的、不到一年的、超过一年。文章来源地址https://www.toymoban.com/news/detail-678571.html

package main

import (
	"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语言圣经 第四章习题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机网络——第四章网络层习题(部分)

     思路:将前缀匹配全部转换为二进制,每八位之间用“ . ”隔开。然后用目的地址对应的二进制,找到与前缀匹配的,即为下一跳地址              为了方便计算,记一下:                 2的1次方:2                 2的2次方:4               

    2024年02月09日
    浏览(47)
  • 计量经济学及Stata应用 第四章习题

    考虑以下消费函数:Ci = α+βYi+si 共中,Ci为个体i的消费开支,而只Yi为个体三的可支配收入。假设OLS因归所得的样木回归线为:  (1)斜率β尖的经济含义是什么? (2)截距项α尖的经济含义是什么?. (3)对于个体i,计算其平均消费倾向(average propensity to consume)Ci/Yi。假设α尖0,

    2024年02月02日
    浏览(54)
  • 计算机网络/谢希仁(第八版)第四章习题

    【4-01】网络层向上提供的服务有哪两种?试比较其优缺点。 答: (1)面向连接服务(或虚电路服务)和无连接服务(或数据报服务) (2)比较二者的优缺点: ①、虚电路服务是面向连接的,提供的服务可以保证数据传输的可靠性和投递顺序的正确性;数据报服务是无连接

    2024年02月04日
    浏览(45)
  • 数据挖掘(Data Mining)第四章课后习题

    1、数据仓库是随着时间变化的,下面的描述不正确的是(  数据仓库随着事件变化不断删去旧的数据内容  ) 2、下面关于数据粒度的描述不正确的是(  数据综合度越高,粒度也就越大,级别也就越高  ) 3、在有关数据仓库测试,下列说法不正确的是(  在数据仓库进

    2024年02月07日
    浏览(38)
  • 【机器学习】第四章决策树练习题及答案

    一. 单选题(共10题,66分) 1. 【单选题】以下关于决策树特点分析的说法错误的有 ( )。 A. 推理过程容易理解,计算简单 B. 算法容易造成过拟合 C. 算法自动忽略了对模型没有贡献的属性变量 D. 算法考虑了数据属性之间的相关性 正确答案: D 2. 【单选题】以下关于决策树原理

    2024年02月01日
    浏览(62)
  • Java Web程序设计课后习题答案 第四章

    第4章 一、填空 1.如果当前Web资源不想处理请求, RequestDispatcher接口提供了一个 forward()方法,该方法可以将当前请求传递给其他Web资源对这些信息进行处理并响应给客户端,这种方式称为请求转发。 2.Servlet API中,专门用来封装HTTP响应消息的接口是HttpServletResponse。 3. 重定向指

    2024年04月23日
    浏览(39)
  • 微信小程序开发实战课后习题解答————第四章(作业版)

    一、填空题 1、  组件  是视图层的基本组成单元。 2、 swiper内部只可以放置   swiper-item    组件。 3、 设置text文本内容长按可选的属性是   selectable   。    4、navigator组件通过设置   open-type    属性,来区分不同的跳转功能。 5、通过image的  mode    属性来设定不同的图

    2024年02月06日
    浏览(58)
  • 计算机网络(谢希仁-第八版)第四章习题全解

    4-01 网络层向上提供的服务有哪两种?试比较其优缺点? 虚电路服务和数据报服务。 虚电路    优点:      1.可以提供可靠的通信服务       2.因为数据是沿着建立的虚电路进行传输的,因此分组的首部不需要携带完整的目的主机          的地址,只需要填写这条虚电路

    2024年02月05日
    浏览(47)
  • 神经网络与深度学习第四章前馈神经网络习题解答

    [习题4-1] 对于一个神经元  ,并使用梯度下降优化参数时,如果输入恒大于0,其收敛速度会比零均值化的输入更慢。 首先看一下CSDN的解释: 如果输入x恒大于0,使用sigmoid作为激活函数的神经元的输出值将会处于饱和状态,导致其梯度接近于0,这会使得梯度下降算法的收敛

    2024年02月06日
    浏览(45)
  • 计算机网络原理 谢希仁(第8版)第四章习题答案

    4-01 网络层向上提供的服务有哪两种?试比较其优缺点。 面向连接的和无连接。 面向连接优点: 通过虚电路发送分组,分组只用填写虚电路编号,分组开销较小; 分组按序达到终点。 面向连接缺点: 一个节点出故障,所有通过该节点的虚电路均不能工作; 可靠通信交给网

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包