[第三天]剑指offer,每日一刷

每日小奋斗

1.剑指 Offer 15. 二进制中1的个数

幸好我fmt包用得好

func hammingWeight(num uint32) int {
	return strings.Count(fmt.Sprintf("%b", num), "1")
}

说实话,我只能想到这一种方法,顶多就是在数字1的寻找上多玩玩花样

2.剑指 Offer 17. 打印从1到最大的n位数

这一题也不是很难,控制一下打印的数值小于10的n次方就可以

func printNumbers(n int) []int {
	res := []int{}
	for i := 1; i < int(math.Pow(10, float64(n))); i++ {
		res = append(res, i)
	}
	return res
}

当然我写完之后觉得这个math.pow这样的函数用的不是非常好,因为可以看到涉及到太多的类型转换

func printNumbers(n int) []int {
	res := []int{}
	target := 1
	for i := 1; i <= n; i++ {
		target *= 10
	}
	fmt.Println(target)
	for i := 1; i < target; i++ {
		res = append(res, i)
	}
	return res
}

这个在提交的速度上确实快了很多

3.剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

func exchange(nums []int) []int {
	// 头尾双指针的写法去写
	start, end := 0, len(nums)-1
	for start < end {
		if nums[start]%2 == 0 && nums[end]%2 == 1 {
			nums[start], nums[end] = nums[end], nums[start]
		} else if nums[start]%2 == 1 {
			start++
		} else if nums[end]%2 == 0 {
			end--
		}
	}
	return nums
}

这道题可以用力大砖飞的方法去写,比如分辨将奇数和偶数摘出来,然后合并,但是我这次尝试了一下头尾双指针,第一二次接触了,确实很优雅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值