zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Golang 切片数组打印元素两数只和等于8的下标、无重复字符的最长子串

字符数组Golang 元素 重复 打印 最长 子串
2023-09-11 14:14:56 时间

Golang 切片数组打印元素两数只和等于8的下标

package main

import "fmt"

func main() {
	var nums = []int{2, 5, 8, 6}
	res := twoSum(nums, 8)
	fmt.Println(res)
}
func twoSum(nums []int, target int) []int {
	length := len(nums)
	match := make(map[int]int, length)
	for i := 0; i < length; i++ {
		// fmt.Println(target, nums[i])
		if index, ok := match[target-nums[i]]; ok {
			return []int{index, i}
		}
		match[nums[i]] = i
	}
	return nil
}

// []int{2:0,3:1,8:0}
PS E:\TEXT\test_go\test> go run .\main.go
[0 3]
PS E:\TEXT\test_go\test> 

无重复字符的最长子串

package main

import "fmt"

func main() {

	fmt.Println(lengthOfLongestSubstring("wgchenswg"))

}
func lengthOfLongestSubstring(s string) int {
	// 哈希集合,记录每个字符是否出现过
	m := map[byte]int{}
	n := len(s)
	// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
	rk, ans := -1, 0
	for i := 0; i < n; i++ {
		if i != 0 {
			// 左指针向右移动一格,移除一个字符
			delete(m, s[i-1])
		}
		for rk+1 < n && m[s[rk+1]] == 0 {
			// 不断地移动右指针
			m[s[rk+1]]++
			rk++
		}
		// 第 i 到 rk 个字符是一个极长的无重复字符子串
		ans = max(ans, rk-i+1)
	}
	return ans
}

func max(x, y int) int {
	if x < y {
		return y
	}
	return x
}