go语言学习 11/5/2019

闭包非递归斐波那契:

package main

import "fmt"

func main() {
	var result = fibonacci()
	for i := 0; i <= 10; i++ {
		fmt.Printf("fibonacci(%d) is: %d\n", i, result(i))
	}
}

func fibonacci() func(int) int {
	a = 0

	return func(delta int) int {
		defer func() {
			a,b = b, a+b
		}()
		return b
	}
}

 斐波那契闭包调试代码:

func fibonacci() func(int) int {
	a,b := 0,1

	return func(delta int) int {
		defer func() {
			a,b = b, a+b
		}()
		_, file, line, _ := runtime.Caller(1)
		log.Printf("%s:%d", file, line)
		return b
	}

}

  

 

 

 可以看到for循环中闭包调试的代码并不是同步的,中间的原理就不得而知了

 

计算运行时间

start := time.Now()
fibonacci()
end := time.Now()
delta := end.Sub(start)
fmt.Printf("longCalculation took this amount of time: %s\n", delta)

  快速排序:

func quickSort(nums []int,left,right int) {
	if left >= right{
		return
	}
	index :=partition(nums,left,right)
	quickSort(nums,left,index - 1)
	quickSort(nums,index + 1,right)
}
func partition(nums []int,left,right int) int{
	baseNum := nums[left]
	for left < right{
		for (nums[right] >= baseNum && right > left){
			right--
		}
		nums[left] = nums[right]
		for (nums[left] <=baseNum && right > left) {
			left++
		}
		nums[right] = nums[left]
	}
	nums[right] = baseNum
	return right
}

  

-给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

func twoSum(nums []int, target int) []int {
	var mapNeed map[int]int
	mapNeed = make(map[int]int)

	for num0:=0;num0<=len(nums);num0++{
		var num = target - nums[num0]
		if v,ok :=mapNeed[num];ok{
			return []int{v,num0}
		}else{
			mapNeed[nums[num0]]=num0

		}
	}
	return []int{}
}

  

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

var c int
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
	if l1==nil&&l2==nil&&c==0{
		return nil
	}
	if l1!=nil{
		c+=l1.Val
		l1=l1.Next
	}
	if l2!=nil{
		c+=l2.Val
		l2=l2.Next
	}
	var cur ListNode
	cur.Val= c%10
	c=c/10
	cur.Next=addTwoNumbers(l1,l2)
	return &cur
}

  给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度

func lengthOfLongestSubstring(s string) int {
	var maxsize,base int
	var dict = [256]int{}
	for key:=0;key<len(s);key++{
		var i = s[key]
		if dict[i] >base{
			base = dict[i]
		}
		dict[i] = key + 1
		if maxsize<key-base+1{
			maxsize	 =  key-base+1
		}
	}
	return maxsize
}

  

 

posted @ 2019-11-05 10:33  杨归元  阅读(175)  评论(0编辑  收藏  举报