topic
- https://leetcode.cn/studyplan/top-100-liked/;
- https://leetcode.cn/studyplan/top-interview-150/;
- https://leetcode.cn/problem-list/xb9nqhhg/;
jianzhi
剑指 Offer 03. 数组中重复的数字
- https://leetcode.cn/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/description/?favorite=xb9nqhhg
- 哈希,迭代更换;
- golang:
go
package main
import "fmt"
func findRepeatNumber(nums []int) int {
countMap := map[int]int{}
for _, v := range nums {
if countMap[v] > 0 {
return v
} else {
countMap[v]++
}
}
return -1
}
func main() {
nums := []int{2, 3, 1, 0, 2, 5, 3}
fmt.Println(findRepeatNumber(nums))
// fmt.Println(ans)
}- js:
js
/**
* @param {number[]} nums
* @return {number}
*/
var findRepeatNumber = function(nums) {
let countSet = new Set();
for(const v of nums){
if(countSet.has(v)){
return v
}
countSet.add(v)
}
return -1
};
nums = [2, 3, 1, 0, 2, 5, 3]
console.log(findRepeatNumber(nums))剑指 Offer 04. 二维数组中的查找
剑指 Offer 05. 替换空格
剑指 Offer 06. 从尾到头打印链表
剑指 Offer 07. 重建二叉树
go
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func buildTree(preorder []int, inorder []int) *TreeNode {
if len(preorder) == 0 {
return nil
}
if len(preorder) != len(inorder) {
return nil
}
head := &TreeNode{
Val: preorder[0],
}
headValIndex := -1
for i, v := range inorder {
if v == preorder[0] {
headValIndex = i
break
}
}
// len: headValIndex
if headValIndex == -1 {
return nil
}
leftSlice1 := preorder[1 : headValIndex+1]
leftSlice2 := inorder[:headValIndex]
head.Left = buildTree(leftSlice1, leftSlice2)
rightSlice1 := preorder[1+headValIndex:]
rightSlice2 := inorder[headValIndex+1:]
head.Right = buildTree(rightSlice1, rightSlice2)
return head
}
func main() {
nums1 := []int{3, 9, 20, 15, 7}
nums2 := []int{9, 3, 15, 20, 7}
fmt.Println("%+v\n", buildTree(nums1, nums2))
}剑指 Offer 09. 用两个栈实现队列
剑指 Offer 10- I. 斐波那契数列
剑指 Offer 10- II. 青蛙跳台阶问题
剑指 Offer 11. 旋转数组的最小数字
剑指 Offer 12. 矩阵中的路径
go
package main
import "fmt"
func minArray(numbers []int) int {
cur1 := numbers[0]
cur2 := numbers[len(numbers)-1]
if cur1 < cur2 {
return cur1
}
// cur1 > cur2
left, right := 0, len(numbers)-1
mid := 0
for left < right {
mid = (left + right) / 2
// fmt.Println(left, right, mid)
if numbers[mid] < numbers[right] {
right = mid
} else if numbers[mid] > numbers[right] {
left = mid + 1
} else {
right--
}
}
return numbers[left]
}
func main() {
// nums := []int{3, 4, 5, 1, 2}
// nums := []int{2, 2, 2, 0, 1}
nums := []int{3, 1, 1}
fmt.Println(minArray(nums))
}