当前位置: 首页 > 面试题库 >

在Go中使用切片进行子集检查

胡鸿志
2023-03-14
问题内容

我正在寻找一种有效的方法来检查切片是否是另一个切片的子集。我可以简单地遍历它们进行检查,但是我觉得必须有更好的方法。

例如

{1,2,3}是{1,2,3,4}
的子集{1,2,2}不是{1,2,3,4}的子集

有效执行此操作的最佳方法是什么?

谢谢!


问题答案:

我认为解决子集问题的最常见方法是通过地图。

package main

import "fmt"

// subset returns true if the first array is completely
// contained in the second array. There must be at least
// the same number of duplicate values in second as there
// are in first.
func subset(first, second []int) bool {
    set := make(map[int]int)
    for _, value := range second {
        set[value] += 1
    }

    for _, value := range first {
        if count, found := set[value]; !found {
            return false
        } else if count < 1 {
            return false
        } else {
            set[value] = count - 1
        }
    }

    return true
}

func main() {
    fmt.Println(subset([]int{1, 2, 3}, []int{1, 2, 3, 4}))
    fmt.Println(subset([]int{1, 2, 2}, []int{1, 2, 3, 4}))
}

检查重复值的能力相对罕见。上面的代码按要求解决了问题(请参阅:http :
//play.golang.org/p/4_7Oh-fgDQ)。如果您打算使用重复的值,则必须像上面的代码一样保留一个计数。如果没有重复的值,则可以通过使用布尔值(而不是整数)来更紧凑地解决问题。



 类似资料:
  • 切片是Go语言的关键类型之一,它提供了比数组更多的功能。 示例1: package main import "fmt" func main() { // 和数组不同的是,切片的长度是可变的。 // 我们可以使用内置函数make来创建一个长度不为零的切片 // 这里我们创建了一个长度为3,存储字符串的切片,切片元素 // 默认为零值,对于字符串就是""。 s

  • 问题内容: 如何在Go中反转任意切片()?我宁愿不必编写和使用。有没有简单的内置方法来做到这一点? 问题答案: 没有一个简单的,内置的用于反转接口{}的部分。您可以编写一个for循环来做到这一点: Go 1.8中引入的reflect.Swapper函数可用于编写通用的反转函数: 游乐场的例子

  • 问题内容: 我正在尝试将切片和切片结合起来。如何在Go中执行此操作? 我试过了: 但得到: 但是,文档似乎表明这是可能的,我想念的是什么? 问题答案: 在第二个切片之后添加点: 就像任何其他可变参数函数一样。

  • 问题内容: 在Go中清除切片的适当方法是什么? 这是我在go论坛中找到的内容: 这样对吗? 为了澄清起见,清除了缓冲区,以便可以重用它。 一个示例是bytes包中的Buffer.Truncate函数。 请注意,Reset只是调用Truncate(0)。因此看来,在这种情况下,第70行将评估:b.buf = b.buf [0:0] http://golang.org/src/pkg/bytes/bu

  • 创建大小为的隐式数组,并创建一个隐式数组的浅副本,指向数组中的前7个元素。 考虑 创建不指向任何隐式数组的零长度切片。 创建长度为2的新隐式数组,并附加值和。slice()指向新的隐式数组,其中

  • 我正在尝试组合切片和切片。我怎么能在围棋中做到这一点? 我试过: 但是得到: 然而,文档似乎表明这是可能的,我遗漏了什么?