使用双指针方法在Golang中查找两个排序数组的交集

使用双指针方法在Golang中查找两个排序数组的交集

在本篇Go语言文章中,我们将编写程序,使用双指针方法查找两个数组的交集。交集指的是两个数组之间的相似元素或最常见元素。

语法

func make ([] type, size, capacity)

在go语言中,make函数用于创建一个数组/映射,它接受要创建的变量类型,其大小和容量作为参数。

func append(slice, element_1, element_2…, element_N) []T

append函数用于将值添加到数组切片中。它需要参数的数量。第一个参数是我们要向其中添加值的数组,其次是要添加的值。然后,函数将返回包含所有值的最终数组切片。

func range(variable)

range函数用于对任何数据类型进行迭代。为了使用它,我们首先必须写出range关键字,后跟我们要迭代的数据类型,结果循环将迭代到变量的最后一个元素。

sort.Ints()

该函数属于sort包,用于对包含整数值的切片/数组进行排序。

使用if-else条件语句中的双指针方法

在此方法中,我们将编写一个Golang程序,使用if条件语句查找两个数组的交集。if条件语句用于比较数组元素,并将交集点添加到切片中以打印输出。

算法

  • 第一步 − 在程序中导入fmt,main和sort包,其中fmt用于格式化输入和输出,main确保程序应为可执行程序,而sort用于对数组进行排序

  • 第二步 − 创建一个名为intersect的函数,带有两个输入参数array1和array2

  • 第三步 − 使用sort包中的Ints方法对两个数组进行排序

  • 第四步 − 然后,将变量i和j初始化为0,这些变量是数组的索引

  • 第五步 − 在此步骤中,创建一个空的交集切片以存储两个数组的交集点

  • 第六步 − 遍历数组1和数组2,并检查元素是否相同,如果相同,则将元素附加到交集切片中,并递增i和j变量。

  • 第七步 − 如果第一个数组元素小于第二个数组元素,则递增I变量,否则递增j变量。

  • 第八步 − 最后,将切片返回给外部创建的函数,在主体中使用fmt包的Println函数接收并打印到控制台,其中ln表示换行。

示例

以下Golang程序说明了如何在if条件语句中使用双指针方法查找两个数组的交集。

package main

import (
   "fmt"
   "sort"
)

func intersect(array1 []int, array2 []int) []int {

   sort.Ints(array1)
   sort.Ints(array2)

   i := 0 
   j := 0 

   var intersection []int

   for i < len(array1) && j < len(array2) {
      // 如果两个数组的元素相同,则将其添加到交集切片中
      if array1[i] == array2[j] {
         intersection = append(intersection, array1[i])
         i++
         j++
      } else if array1[i] < array2[j] {
         i++
      } else {
         j++
      }
   }
   return intersection
}
func main() {

   array1 := []int{1, 2, 2, 3}
   array2 := []int{2, 2}

   intersection_points := intersect(array1, array2)

   fmt.Println("两个数组的交集为:")
   fmt.Println(intersection_points) 
}

输出结果

两个数组的交集为:
[2 2]

通过频率映射使用两个指针的方法

在该方法中,我们将编写一个 Golang 程序,使用频率映射来统计每个元素的出现次数并将其存储在映射中,以查找两个数组的交集。

算法步骤

  • 步骤1 − 在程序中导入 fmt 和 main 包,其中 fmt 可帮助格式化输入和输出,main 确保程序是可执行程序。

  • 步骤2 − 创建一个有两个参数 array1 和 array2 的 intersect 函数,并在该函数中使用 make 函数创建一个频率映射,该函数是 Go 中的内置函数。

  • 步骤3 − 遍历 array1 并计算数组中元素的出现次数并存储在映射中

  • 步骤4 − 创建一个交集切片,用于存储两个数组的交集点。

  • 步骤5 − 接下来,遍历 array2 并检查元素的频率是否大于 0。

  • 步骤6 − 如果满足条件,则将值添加到交集切片中,并将值减少 1。

  • 步骤7 − 将切片返回给外部函数,并在 main 函数中使用 fmt 包中的 Println 函数输出结果,其中 ln 表示换行。

示例

以下 Golang 程序解释了如何使用频率映射使用两个指针的方法查找两个数组的交集点。

package main

import "fmt"

func intersect(array1 []int, array2 []int) []int {

   freq := make(map[int]int)
   for _, value := range array1 {
      freq[value]++    
   }

   var intersection []int

   for _, value := range array2 {
      if freq[value] > 0 {
         intersection = append(intersection, value)
         freq[value]--
      }
   }
   return intersection
}

func main() {
   array1 := []int{1, 2, 2, 3}
   array2 := []int{2, 2}
   intersection_point := intersect(array1, array2)
   fmt.Println("两个数组的交集为:")
   fmt.Println(intersection_point) 
}

输出结果

两个数组的交集为:
[2 2]

结论

我们编译并执行了两个例子,使用两个指针方法查找了两个数组的交集。在第一个示例中,我们使用条件 if-else 语句,在第二个示例中,我们使用频率映射来获取结果。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程