[日常] Go语言圣经-指针对象的方法-bit数组习题2

练习 6.3: (*IntSet).UnionWith会用|操作符计算两个集合的交集,我们再为IntSet实现另外的几个函数IntersectWith(交集:元素在A集合B集合均出现),DifferenceWith(差集:元素出现在A集合,未出现在B集合),SymmetricDifference(并差集:元素出现在A但没有出现在B,或者出现在B没有出现在A)。

*练习6.4: 实现一个Elems方法,返回集合中的所有元素,用于做一些range之类的遍历操作。

练习 6.2: 定义一个变参方法(*IntSet).AddAll(...int),这个方法可以添加一组IntSet,比如s.AddAll(1,2,3)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/*
练习 6.3: (*IntSet).UnionWith会用|操作符计算两个集合的交集,我们再为IntSet实现另外的几个函数IntersectWith(交集:元素在A集合B集合均出现),DifferenceWith(差集:元素出现在A集合,未出现在B集合),Sym
metricDifference(并差集:元素出现在A但没有出现在B,或者出现在B没有出现在A)。
*/
//交集:元素在A集合B集合均出现
func (s *IntSet) IntersectWith(t *IntSet) IntSet {
        var result IntSet
        for i, word := range s.words {
                if i >= len(t.words) {
                        break
                }  
                result.words = append(result.words, word&t.words[i])
        }  
        return result
}
 
//差集:元素出现在A集合,未出现在B集合
func (s *IntSet) DifferenceWith(t *IntSet) IntSet {
        var result IntSet
        for i, word := range s.words {
                if i >= len(t.words) {
                        result.words = append(result.words, word)
                        continue
                }  
                result.words = append(result.words, word&(word^t.words[i]))
        }  
        return result
}
 
//并差集:元素出现在A但没有出现在B,或者出现在B没有出现在A
func (s *IntSet) SymmetricDifference(t *IntSet) IntSet {
        var result IntSet
        for i, word := range s.words {
                if i >= len(t.words) {
                        result.words = append(result.words, word)
                        continue
                }  
                result.words = append(result.words, word^t.words[i])
        }  
        return result
}
 
//练习6.4: 实现一个Elems方法,返回集合中的所有元素,用于做一些range之类的遍历操作。
func (s *IntSet) Elems() []int {
        var result []int
        for i, word := range s.words {
                for j := 0; j < 64; j++ {
                        if word&(1<<uint(j)) != 0 {
                                result = append(result, 64*i+j)
                        }  
                }  
        }  
        return result
}
//练习 6.2: 定义一个变参方法(*IntSet).AddAll(...int),这个方法可以添加一组IntSet,比如s.AddAll(1,2,3)。
func (s *IntSet) AddAll(elements ...int) {
        for _, r := range elements {
                s.Add(r)
        }
}

  

posted @   唯一客服系统开发笔记  阅读(379)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2017-04-21 [Linux] PHP程序员玩转Linux系列-telnet轻松使用邮箱
2016-04-21 [android] 手机卫士号码归属地查询
2016-04-21 [Redis] redis在centos下安装测试
2016-04-21 [产品设计]电商设计知乎总结
点击右上角即可分享
微信分享提示
1
chat with us