LeetCode力扣Golang实现/数组:70、1、88、283、448

本文详细讲解了LeetCode中的几道经典算法题,包括70题爬楼梯的斐波那契数列解法,避免递归导致的效率问题;1题两数之和的哈希表解决方案;88题合并两个有序数组的双指针方法;283题移动零的数组操作;以及448题找到所有数组中消失的数的取反标记策略。通过这些题目,深入探讨了Go语言中的数据结构和算法实现技巧。
摘要由CSDN通过智能技术生成

【Leetcode算法500题】目前B站最完整的数据结构算法教程,包含所有刷题攻略!这还没人看,我不更了!_哔哩哔哩_bilibili

70 爬梯子

不能用递归,递归层数太多了,注意tmp

func ClimbStairs(n int) int {
	if n == 1 {
		return 1
	} else if n == 2 {
		return 2
	} else {
		f1 := 1
		f2 := 2
		for i := 3; i < n; i++ {
			tmp := f1 + f2
			f1 = f2
			f2 = tmp
		}
		return f1 + f2
	}
}

1、两数之和

①刚开始是返回值的问题:Go-missing return at end of function

   报错原因:Go-missing return at end of function_weixin_30908103的博客-CSDN博客  

    一般意思是没有返回值,要用return

② 数组的声明形式,

    A.最后返回的是int数组,当 a:=make([]int) 时会报错:invalid operation: make([]int) expects 2 or 3 arguments; found 1

      此处是make的用(类型,内存,预留空间),报错需要2-3个参数,所以只要类型是不行的:go的make()的用法和参数含义_奋起的菜鸟_kk的博客-CSDN博客_go的make

      要用在这里只能是 a:=make([]int,0),由于数组有自动扩充内容,所以0无所谓

   B.关于数组的声明 ,自动推导类型[]内必须是整数且>0    Go语言中数组的声明与使用_sanqima的博客-CSDN博客_go 声明数组

     a:=[2]int{1,2}     =>  a = {1,2}  

     a:=[2]int             =>  a = {0,0}  

      但是如果这样!就会自动填充0!!

      综上所述,在数组定义时如果没有初始内容,最好不用自动推导类型, var a []int

题解:利用哈希表,为了避免结果重复,只能在遍历的时候生成哈希表

func twoSum(nums []int, target int) []int {
	stoMap := make(map[int]int, 4)
	a := make([]int, 0)
	for i := 0; i < len(nums); i++ {
		other := target - nums[i]
		_, ok := stoMap[other]
		if ok == true {
			a = append(a, stoMap[other], i)
		} else {
			stoMap[nums[i]] = i
		}
	}
	return a
}

88、合并两个有序数组

刚开始想到的是双指针,但是go里指针好像不能移动,有点凝固,然后在评论区里参考了一下这位朋友的方法

执行过程中:

刚开始在m1、n2 等于0的条件思路有点混乱,所以在第42个实例好像是,关于输入[0] ,[1]的时候报错很多很多次,结果不正确,还有报错过,超出列表范围(因为没有单写m1<0的情况,而是和第二个else if 合在一起了,所以进入循环的时候会有nums[-1],报错超出列表的范围,一定要注意)

func merge(nums1 []int, m int, nums2 []int, n int) {
	m1 := m - 1
	n2 := n - 1
	k := m + n - 1
	for n2 >= 0 && m1 >= 0 {
		if nums1[m1] > nums2[n2] {
			nums1[k] = nums1[m1]
			k--
			m1--
		} else if nums1[m1] < nums2[n2] {
			nums1[k] = nums2[n2]
			k--
			n2--
		} else {
			nums1[k] = nums1[m1]
			nums1[k-1] = nums2[n2]
			k = k - 2
			m1--
			n2--
		}

	}
	if m1 < 0 {
		for n2 >= 0 {
			nums1[k] = nums2[n2]
			k--
			n2--
		}
	}
}

283、移动零

在这儿尝试了一下有两个小小问题:

①循环体里声明的变量只能在循环体里使用,刚开始 i  定义在for里,j循环的时候报错没有i 

     后来查了一下for里变量的作用域,详情见golang for循环体中创建的变量的作用域_张康佳的博客-CSDN博客_golang 循环里面新建变量

② for 后面的形式,因为 i 定义了,就想偷个懒 for i <len(nums);i++; 失败

后来确定了一下果然只有三种形式,第一个就是for,第二个三个条件全有,第三个就是这种

③ 本来想nums[j++] = nums[i++]省点事儿,报错 unexpected ++, expecting :

自增只能自己一行,不然报错 unexpected ++

func moveZeroes(nums []int)  {
    if nums == nil{
        return 
    }  
    j:=0
    var i int 
    for i = 0;i<len(nums);i++{
        if nums[i] !=0{
            nums[j] = nums[i]
            j++
        }
    }
    for  j<i {
        nums[j] =0
        j++ 
    }

}

448、找到所有数组中消失的数

这道里有一点点晕乎,利用取反和两个遍历,有两个地方注意一下

① 刚开始傻了想了半天取反的办法还查了文档函数,就-1*a就行

②第一个for中元素判断的问题,这儿感觉写的有点笨了,后面还会看看能不能优化一下

有两个情况要注意一下,一个是之前已经把 nums[i] 变成负数了,这时候要判断

一个是如果存在重复元素,再变换就会负负得正,所以还要再判断一下

稍有不注意就  index out of range

还要注意一下,最后加入数组的是j+1,没有变化的元素下标+1才是所求

func findDisappearedNumbers(nums []int) []int {
    var a []int
    for i:=0;i<len(nums);i++{
        b:= nums[i]
        if b>=0{
            if nums[b-1]>0{
            nums[b-1] = -1*nums[b-1]
            }
        }else{
            if nums[-1*b-1]>0{
                nums[-1*b-1] = -1*nums[-1*b-1]
            } 
        }
    }
    
    for j:=0;j<len(nums);j++{
        if nums[j]>0{
            a = append(a,j+1)
        }
    }
    return a
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值