反转字符串中的单词
func reverseWords(s string) string {
length := len(s)
ret := []byte{}
for i := 0; i < length; {
start := i
for i < length && s[i] != ' ' {
i++
}
for p := start; p < i; p++ {
ret = append(ret, s[start + i - 1 - p])
}
for i < length && s[i] == ' ' {
i++
ret = append(ret, ' ')
}
}
return string(ret)
}
反转字符串
func reverseString(s []byte) {
for left, right := 0, len(s)-1; left < right; left++ {
s[left], s[right] = s[right], s[left]
right--
}
}
Nim 游戏
func canWinNim(n int) bool {
return n%4 != 0
}
除自身以外数组的乘积
func productExceptSelf(nums []int) []int {
length := len(nums)
answer := make([]int, length)
// answer[i] 表示索引 i 左侧所有元素的乘积
// 因为索引为 '0' 的元素左侧没有元素, 所以 answer[0] = 1
answer[0] = 1
for i := 1; i < length; i++ {
answer[i] = nums[i-1] * answer[i-1]
}
// R 为右侧所有元素的乘积
// 刚开始右边没有元素,所以 R = 1
R := 1
for i := length - 1; i >= 0; i-- {
// 对于索引 i,左边的乘积为 answer[i],右边的乘积为 R
answer[i] = answer[i] * R
// R 需要包含右边所有的乘积,所以计算下一个结果时需要将当前值乘到 R 上
R *= nums[i]
}
return answer
}
删除链表中的节点
func deleteNode(node *ListNode) {
node.Val = node.Next.Val
node.Next = node.Next.Next
}
二叉搜索树中第K小的元素
中序遍历
func kthSmallest(root *TreeNode, k int) int {
stack := []*TreeNode{}
for {
for root != nil {
stack = append(stack, root)
root = root.Left
}
stack, root = stack[:len(stack)-1], stack[len(stack)-1]
k--
if k == 0 {
return root.Val
}
root = root.Right
}
}
记录子树的结点数
type MyBst struct {
root *TreeNode
nodeNum map[*TreeNode]int // 统计以每个结点为根结点的子树的结点数,并存储在哈希表中
}
// 统计以 node 为根结点的子树的结点数
func (t *MyBst) countNodeNum(node *TreeNode) int {
if node == nil {
return 0
}
t.nodeNum[node] = 1 + t.countNodeNum(node.Left) + t.countNodeNum(node.Right)
return t.nodeNum[node]
}
// 返回二叉搜索树中第 k 小的元素
func (t *MyBst) kthSmallest(k int) int {
node := t.root
for {
leftNodeNum := t.nodeNum[node.Left]
if leftNodeNum < k-1 {
node = node.Right
k -= leftNodeNum + 1
} else if leftNodeNum == k-1 {
return node.Val
} else {
node = node.Left
}
}
}
func kthSmallest(root *TreeNode, k int) int {
t := &MyBst{root, map[*TreeNode]int{}}
t.countNodeNum(root)
return t.kthSmallest(k)
}
存在重复元素
func containsDuplicate(nums []int) bool {
set := map[int]struct{}{}
for _, v := range nums {
if _, has := set[v]; has {
return true
}
set[v] = struct{}{}
}
return false
}
fmt.Println(struct{}{})打印为{},d, hass := set[v] fmt.Println(hass) fmt.Println(d)打印为{}和true或者false
数组中的第K个最大元素
基于堆排序的选择方法
func findKthLargest(nums []int, k int) int {
heapSize := len(nums)
buildMaxHeap(nums, heapSize)
for i := len(nums) - 1; i >= len(nums) - k + 1; i-- {
nums[0], nums[i] = nums[i], nums[0]
heapSize--
maxHeapify(nums, 0, heapSize)
}
return nums[0]
}
func buildMaxHeap(a []int, heapSize int) {
for i := heapSize/2; i >= 0; i-- {
maxHeapify(a, i, heapSize)
}
}
func maxHeapify(a []int, i, heapSize int) {
l, r, largest := i * 2 + 1, i * 2 + 2, i
if l < heapSize && a[l] > a[largest] {
largest = l
}
if r < heapSize && a[r] > a[largest] {
largest = r
}
if largest != i {
a[i], a[largest] = a[largest], a[i]
maxHeapify(a, largest, heapSize)
}
}