zoukankan      html  css  js  c++  java
  • [日常] 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)。

    /*
    练习 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)
            }
    }
    

      

  • 相关阅读:
    A1023 Have Fun with Numbers (20分)(大整数四则运算)
    A1096 Consecutive Factors (20分)(质数分解)
    A1078 Hashing (25分)(哈希表、平方探测法)
    A1015 Reversible Primes (20分)(素数判断,进制转换)
    A1081 Rational Sum (20分)
    A1088 Rational Arithmetic (20分)
    A1049 Counting Ones (30分)
    A1008 Elevator (20分)
    A1059 Prime Factors (25分)
    A1155 Heap Paths (30分)
  • 原文地址:https://www.cnblogs.com/taoshihan/p/8900467.html
Copyright © 2011-2022 走看看