1. 程式人生 > >Golang演算法題目小計

Golang演算法題目小計

1 請符合兩數之和的索引

給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。

你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。

示例:

給定 nums = [2, 7, 11, 15], target = 9

因為 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 第一種實現:暴力破解法

func twoSum(nums []int, target int) []int {
    length := len(nums)
    for i:=0;i<length;i++{
        for j:=i+1;j<length;j++{
            if t := nums[i]+nums[j];t==target{
                return []int{i,j}
            }
            
        }
    }
    return []int{}
}

第二種:利用map時間複雜度O(1)大資料時候更為明顯

func Getk(nums []int,val int)[]int{
	length := len(nums)
	mymap := make(map[int]int,length)
	for i,v := range nums {
		mymap[v] = i
	}
	for i,v := range nums {
		yu := val - v
		if k,ok := mymap[yu];ok {
			return []int{i,k}
		}

	}
	return []int{}
}

第三種:減少n次遍歷

func Getk2(nums []int,val int)[]int{
	length := len(nums)
	mymap := make(map[int]int,length)
	for i,v := range nums {
		yu := val-v
		if vl,ok := mymap[yu];ok{
			return []int{vl,i}
		}else{
			mymap[v]=i
		}
	}
	return []int{}
}

2、找出不重複最多字串位數

	hello := "abcabbacdaftgsya"
	ci := 0
	jj := 0
	mp := make(map[int32]int32)
	for _,v := range hello{
		if _,ok := mp[v];!ok {
			mp[v]=v
			ci++
		}else{
			mp = make(map[int32]int32)
			mp[v]=v

			if ci > jj {
				jj = ci
			}
			ci = 1
		}
	}
	return ci