Golang 使用双指针方法在给定数组中查找给定子数组

Golang 使用双指针方法在给定数组中查找给定子数组

在这篇Golang文章中,我们将使用迭代和优化迭代方法,使用双指针方法来查找给定数组中是否存在给定的子数组。数组是一组具有相同数据类型的元素,按照连续的内存块排列,并使用索引或下标进行访问。

语法

func isSubarrayPresent(arr []int, sub []int) bool {…}

isSubarrayPresent()函数使用双指针方法在给定数组中查找给定子数组是否存在。它以数组和子数组作为参数。

步骤

  • 步骤 1 - 首先,我们需要导入fmt包。

  • 步骤 2 - 现在,创建一个isSubarrayPresent()函数,它接受一个整数类型的数组和子数组。这个函数将返回一个布尔值,指示子数组是否存在于数组中。

  • 步骤 3 - 例如 1 – 如果子数组的长度为零,那么说明它是空的,并且存在于任何数组中。因此,在这种情况下返回true。否则,使用for循环使用一定的条件来匹配子数组的元素和数组。如果子数组的所有元素都存在于数组中,则返回true,否则返回false。

例如 2 – 首先检查子数组的长度是否大于数组的长度,如果是,则返回false。否则,使用for循环加上if-else条件来匹配子数组的元素和数组。如果有匹配,函数会将j增加到下一个子数组元素。如果没有匹配,函数将j重置为零,并将i增加到下一个数组元素。如果子数组的所有元素都存在于数组中,则返回true,否则返回false。

  • 步骤 4 - 开始main()函数。在main()函数内部,初始化数组和子数组。

  • 步骤 5 - 现在,调用isSubarrayPresent()函数,并将数组和子数组传递给它。

  • 步骤 6 - 进一步使用fmt.Println()函数打印结果布尔值。

示例1

在这个示例中,我们将使用迭代方法定义一个isSubarrayPresent()函数,该函数使用双指针方法在给定数组中查找给定子数组是否存在。

package main

import "fmt"

func isSubarrayPresent(arr []int, sub []int) bool {
   if len(sub) == 0 {
      return true
   }

   i := 0
   j := 0

   for i < len(arr) {
      if arr[i] == sub[j] {
         j++
         if j == len(sub) {
            return true
         }
      } else {
         i -= j
         j = 0
      }
      i++
   }
   return false
}

func main() {
   arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
   sub1 := []int{2, 3, 4}
   sub2 := []int{4, 3, 2}
   sub3 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

   fmt.Println(isSubarrayPresent(arr, sub1)) 
   fmt.Println(isSubarrayPresent(arr, sub2)) 
   fmt.Println(isSubarrayPresent(arr, sub3)) 
}

输出

true
false
false

示例2

在这个示例中,我们将定义一个isSubarrayPresent()函数,使用迭代的方式来优化它,用于使用双指针方法在给定数组中查找给定子数组是否存在。

package main

import "fmt"

func isSubarrayPresent(arr []int, sub []int) bool {
   n := len(arr)
   m := len(sub)

   if m > n {
      return false
   }

   i := 0
   j := 0

   for i < n && j < m {
      if arr[i] == sub[j] {
         j++
      } else if j > 0 && arr[i] == sub[j-1] {
         j--
         continue
      } else {
         i = i - j
         j = 0
      }
      i++
   }
   return j == m
}

func main() {
   arr := []int{10, 20, 30, 40, 50, 60, 70, 80, 90}
   s1 := []int{40, 50, 9}
   s2 := []int{5, 2, 10}
   s3 := []int{10, 20, 30, 40, 50}
   fmt.Println(isSubarrayPresent(arr, s1))
   fmt.Println(isSubarrayPresent(arr, s2))
   fmt.Println(isSubarrayPresent(arr, s3))
}

输出

false
false
true

结论

我们成功地编译和执行了一个使用双指针方法的Go语言程序,用于判断给定数组中是否存在给定子数组,并提供了两个示例。在第一个示例中,我们使用了迭代方法,在第二个示例中,我们使用了优化的迭代方法。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程