Skip to content

topic

jianzhi

剑指 Offer 03. 数组中重复的数字

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))
}