>  기사  >  백엔드 개발  >  심층 분석: Golang의 배열 교차 작업

심층 분석: Golang의 배열 교차 작업

WBOY
WBOY원래의
2024-04-04 09:45:01525검색

Golang에서 배열의 교차점을 얻는 방법에는 세 가지가 있습니다. fmt 패키지의 Sprint 및 Scanf를 사용하여 배열을 문자열로 변환하고 한 문자열에서 다른 문자열을 포함하는 요소를 찾습니다. map 패키지를 사용하여 지도를 만듭니다. 키를 맵의 다른 배열 요소로 사용하고 요소가 맵에 있는지 확인하고 math/big 패키지를 사용하여 배열을 큰 정수로 저장하고 교차점 계산에 논리 연산자를 사용합니다.

深入探讨:Golang 中的数组交集操作

심층 분석: Golang의 배열 교차 작업

배열 교차는 한 배열에 포함된 모든 요소를 ​​다른 배열에서 찾는 것을 의미합니다. 이 기사에서는 Go 언어에서 배열 교차 작업을 수행하는 세 가지 방법을 살펴보고 실제 사례를 통해 사용법을 보여줍니다.

방법 1: fmt 패키지의 Sprint 및 Scanf

package main

import (
    "fmt"
    "strings"
)

func main() {
    // 数组 1
    a1 := []int{1, 2, 3, 4, 5}

    // 数组 2
    a2 := []int{2, 3, 5, 6, 7}

    // 转换数组 1 为字符串
    s1 := fmt.Sprint(a1)

    // 转换数组 2 为字符串
    s2 := fmt.Sprint(a2)

    // 寻找数组 1 字符串中的数组 2 元素,并删除重复项
    intersection := []int{}
    for _, v := range strings.Split(s2, " ") {
        if strings.Contains(s1, v) && !contains(intersection, v) {
            intersection = append(intersection, v)
        }
    }

    fmt.Println(intersection)  // 输出: [2 3 5]
}

// contains 函数检查元素 v 是否在数组 intersection 中
func contains(a []int, v int) bool {
    for _, x := range a {
        if x == v {
            return true
        }
    }
    return false
}

방법 2: 맵 패키지

package main

import (
    "fmt"
    "strings"
)

func main() {
    // 数组 1
    a1 := []int{1, 2, 3, 4, 5}

    // 数组 2
    a2 := []int{2, 3, 5, 6, 7}

    // 创建一个映射,键为数组 2 中的元素,值为 true
    m := make(map[int]bool)
    for _, v := range a2 {
        m[v] = true
    }

    // 检查数组 1 中的元素是否也在映射中,并将其添加到交集中
    intersection := []int{}
    for _, v := range a1 {
        if m[v] {
            intersection = append(intersection, v)
        }
    }

    fmt.Println(intersection)  // 输出: [2 3 5]
}

방법 3: math/big 패키지

package main

import (
    "fmt"
    "math/big"
)

func main() {
    // 数组 1
    a1 := []int{1, 2, 3, 4, 5}

    // 数组 2
    a2 := []int{2, 3, 5, 6, 7}

    // 使用 big.Int 存储大整数
    intersection := &big.Int{}

    set1 := new(big.Int)
    for _, v := range a1 {
        set1.SetUint64(uint64(v))
        intersection.Or(intersection, set1)
    }

    set2 := new(big.Int)
    for _, v := range a2 {
        set2.SetUint64(uint64(v))
        intersection.And(intersection, set2)
    }

    result := []int{}
    for i := 0; i < int(intersection.BitLen()); i++ {
        if intersection.Bit(uint(i)) == 1 {
            result = append(result, i+1)
        }
    }

    fmt.Println(result)  // 输出: [2 3 5]
}

실용 사례: 두 배열에서 겹치는 단어 찾기

package main

import (
    "fmt"
    "strings"
)

func main() {
    // 数组 1:文章中的单词
    a1 := []string{"hello", "world", "golang", "programming", "language"}

    // 数组 2:用户搜索的关键词
    a2 := []string{"world", "javascript", "golang", "python"}

    // 使用 fmt 包中的 Sprint 和 Scanf
    intersection := []string{}
    for _, v := range a2 {
        if strings.Contains(strings.Join(a1, " "), v) && !contains(intersection, v) {
            intersection = append(intersection, v)
        }
    }

    fmt.Println(intersection)  // 输出: [world go lang]
}

위 내용은 심층 분석: Golang의 배열 교차 작업의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.