日刷 leetcode-- 简单版(三)

本贴最后更新于 1912 天前,其中的信息可能已经时移世异

timg.jpeg

返回总目录

日刷 leetcode–简单版


58. 最后一个单词的长度

题目描述

image.png

解题思路

  • 定义一个变量统计,从前往后遍历,遇到空格归零就可以了,注意处理最后几个个字符全为空格的情况
  • 定义一个变量统计,从后往前便利,虽然时间复杂度同为 O(n),但是第二个明显快很多
示例代码
func lengthOfLastWord(s string) int {
	var count int
	for i := len(s) - 1; i >= 0; i-- {
		if s[i] == 32 {
			if count == 0 {
				continue
			} else {
				break
			}
		}
		count++
	}
	return count
}
运行结果

执行用时 :0 ms, 在所有 Go 提交中击败了 100.00% 的用户
内存消耗 :2.2 MB, 在所有 Go 提交中击败了 39.13% 的用户

66.加一

题目描述

image.png

解题思路
  • 从后面往前面循环,最后以一位加 1 即可,处理好末尾 9999
func plusOne(digits []int) []int {
	c := 1 // 定义一个变量用来进位,进位归零则程序结束
	for i := len(digits) - 1; i >= 0; i-- {
		digits[i] += c
		c--
		if digits[i] == 10 {
			digits[i] = 0
			c = 1
		}
		if c == 0 {
			return digits
		}
	}
	if c != 0 { // 循环完后依旧存在进位则表示遇到了999
		digits = append([]int{1}, digits...)
	}
	return digits
}
运行结果

执行用时 :0 ms, 在所有 Go 提交中击败了 100.00% 的用户
内存消耗 :2.2 MB, 在所有 Go 提交中击败了 30.57% 的用户

67.二进制求和

题目描述

image.png

解题思路

  • 判断两个字符串的大小,保证 a 为较长的一个
  • 从后往前循环相加,先循环较短的字符串,再循环长字符串剩余的,定义一个变量记录是否需要进位,两个字符串相加是需要加上进位的值
  • 最后判断进位值是否为 0,不为 0 则在相加后字符串最前面一位加 1
示例代码
func addBinary(a string, b string) string {
	la, lb := len(a), len(b)
	if la < lb {
		la, lb = lb, la
		a, b = b, a
	}
	var carry, s byte
	str := make([]byte, la+1)
	for lb > 0 {
		la--
		lb--
		s = byte(a[la]-'0') + byte(b[lb]-'0') + carry
		carry = s / 2
		s = s % 2
		str[la+1] = byte(s + '0')
	}
	for la > 0 {
		la--
		s = byte(a[la]-'0') + carry
		carry = s / 2
		s = s % 2
		str[la+1] = byte(s + '0')
	}
	if carry == 1 {
		str[la] = carry + '0'
	} else {
		str = str[la+1:]
	}
	return string(str[la:])
}
运行结果

执行用时 :0 ms, 在所有 Go 提交中击败了 100.00% 的用户
内存消耗 :2.3 MB, 在所有 Go 提交中击败了 68.18% 的用户

69. x 的平方根

题目描述

image.png

解题思路 1

  • 使用官方包 math.Sqrt,然后提取整数部分即可(不提供代码)

解题思路 2

  • 使用二分法,判断中位数的积是否大于 x,是则右边向左移,否则左边直接等于中位数
  • 注意的是取中位数是要取右中位数,也就是要加 1,不然会死循环
示例代码 2
func mySqrt(x int) int {
	l, r := 0, x/2+1
	for l < r {
		mid := (l + r + 1) / 2
		sqrt := mid * mid
		if sqrt > x {
			r = mid - 1
		} else {
			l = mid
		}
		fmt.Println(l, r, mid)
	}

	return l
}
运行结果

执行用时 :8 ms, 在所有 Go 提交中击败了 29.75% 的用户
内存消耗 :2.8 MB, 在所有 Go 提交中击败了 5.23% 的用户

70. 爬楼梯

题目描述

image.png

解题思路

  • 这是一个标准的斐波拉切数列,所以就不多说
示例代码
func climbStairs(n int) int {
	if n < 3 {
		return n
	}

	a, b := 1, 2
	res := 0
	for i := 2; i < n; i++ {
		res = a + b
		a, b = b, res
	}
	return res
}
运行结果

执行用时 :0 ms, 在所有 Go 提交中击败了 100.00% 的用户
内存消耗 :2 MB, 在所有 Go 提交中击败了 52.61% 的用户

83. 删除排序链表中的重复

题目描述

image.png

解题思路

  • 因为是排序了的,所以就相对来说比较简单,判断是否与下一个相等,相等即后移即可,讲 Next 指向 Next.Next
示例代码
func deleteDuplicates(head *ListNode) *ListNode {
	if head == nil || head.Next == nil {
		return head
	}

	carry := head

	for carry != nil && carry.Next != nil {
		if carry.Val == carry.Next.Val {
			carry.Next = carry.Next.Next
		} else {
			carry = carry.Next
		}
	}
	return head
}
运行结果

执行用时 :4 ms, 在所有 Go 提交中击败了 96.46% 的用户
内存消耗 :3.2 MB, 在所有 Go 提交中击败了 48.18% 的用户

  • 算法
    428 引用 • 254 回帖 • 24 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1388 回帖 • 278 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...