Skip to content

Commit

Permalink
correction
Browse files Browse the repository at this point in the history
  • Loading branch information
DinghaoLI committed Sep 19, 2019
1 parent cd6db6a commit cd7e47e
Show file tree
Hide file tree
Showing 7 changed files with 43 additions and 60 deletions.
2 changes: 1 addition & 1 deletion 012-打印1到最大的N位数/problem012.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func PowNormal(base float64, exp int) float64 {
func showN(n int) error {
top, _ := Pow(10, n)

if (int(top) > MaxInt){
if (int(top) < 0){
return errors.New("Overflow")
}

Expand Down
28 changes: 2 additions & 26 deletions 029-数组中出现次数超过一半的数字/README.md
Original file line number Diff line number Diff line change
@@ -1,31 +1,7 @@
# 题意
# 题目描述:

题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

输入一个字符串,按字典序打印出该字符串中字符的所有排列

例如输入字符串abc,

则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

结果请按字母顺序输出。

注意 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母

样例输入

1 2 3 2 2 2 5 4 2

样例输出

2

# 分析

- 排序以后统计个数
- 基于Partition函数的$O(n)$的查找第K大的数
- 阵地攻守(特点-它出现的次数比其他所有的数组出现的次数之和还要多)pick
- 使用map来建立数字到出现次数的映射



10 changes: 6 additions & 4 deletions 030-最小的K个数/problem030.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
. "../utils"
)

func getMostFreq(nums []int, k int) ([]int, error){
func minK(nums []int, k int) ([]int, error){
res := []int{}
if k > len(nums) {
return res, errors.New("k > length of nums")
Expand Down Expand Up @@ -35,7 +35,9 @@ func getMostFreq(nums []int, k int) ([]int, error){
func main() {
test := []int{1,2,3,4,5,6,7,8,9}
fmt.Println(test)
fmt.Println(getMostFreq(test, 3))
fmt.Println(getMostFreq(test, 4))
fmt.Println(getMostFreq(test, 5))
fmt.Println(minK(test, 1))
fmt.Println(minK(test, 2))
fmt.Println(minK(test, 3))
fmt.Println(minK(test, 4))
fmt.Println(minK(test, 5))
}
5 changes: 4 additions & 1 deletion 049-把字符串转换成整数/problem049.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ func myAtoi(str string) int {
res := 0
flag := 1
start := 0
// space
for start <= len(str)-1 && str[start] == ' ' {
start++
}
// +/-
if start <= len(str)-1 {
if str[start] == '-' {
flag = -1
Expand All @@ -20,15 +22,16 @@ func myAtoi(str string) int {
start++
}
}
// is digital ?
for start <= len(str)-1 && isDigital(str[start]) {
if res == 0 {
fmt.Println(int(str[start] - '0'))
res += int(str[start] - '0')
start++
} else {
res = res*10 + int((str[start] - '0'))
start++
}
// overflow int32
if res*flag > math.MaxInt32 {
return math.MaxInt32
} else if res*flag < math.MinInt32 {
Expand Down
13 changes: 7 additions & 6 deletions 058-二叉树的下一个结点/problem058.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ func getNext(node *TreeNode) *TreeNode {
if node == nil {
return node
}

//如果节点有右子树,那么它的下一个节点就是它的右子树中最左边的节点
if node.Right != nil {
node = node.Right
Expand All @@ -26,14 +25,16 @@ func getNext(node *TreeNode) *TreeNode {
}
// 先取目标的父节点
p := node.Parent
for p.Parent != nil {
// 如果p节点是p的父节点的又节点 =》 继续向上找
if p == p.Parent.Right {
n := node
for p != nil {
// 如果p节点是p的父节点的右节点 =》 继续向上找
if n == p.Right {
n = p
p = p.Parent
continue
}
// p是p父节点的子节点 =》 返回父节点
return p.Parent
// p是p父节点的左节点 =》 返回父节点
return p
}
// 目标节点没有下一个节点
return nil
Expand Down
22 changes: 4 additions & 18 deletions 061-按之字形顺序打印二叉树/README.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,8 @@
# 题目描述
# 题意

请实现两个函数,分别用来序列化和反序列化二叉树。这里没有规定序列化的方式
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

# 分析
# 层次遍历后结果之按字输出

## 遍历二叉树
其实我们可以借鉴层次遍历时候的思路, 参见剑指Offer--060-把二叉树打印成多行, 我们把层次遍历的结果保存在vector< vector >中每一层保存在一个vector中, 那么我们输出的时候就可以进行调整, 按照之字形输出即可

其实这道题约定的序列化没有固定的格式, 只要你序列化后的结果, 再反序列化后与原树相同即可,

因此我们可以随意指定自己的格式,

比如空节点用$表示,或则#表示,

然后遍历采用先序, 中序, 后序或者层次都可以,

我们的示例程序中采用空结点用#表示, 结点与结点用逗号,分隔

选择了合适的遍历算法, 那么剩下的问题就是字符串序列和整数权值的相互转换问题
序列化的关键, 其实就是将树的权值(整数)转换为字符串序列, 可以采用ostringstream, sprintf和itoa

反序列化的关键, 则正好相反, 将字符串转换为整数, 可以使用istringstream, sscanf和atoi
23 changes: 19 additions & 4 deletions 062-序列化二叉树/README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,22 @@
# 题意
# 题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
请实现两个函数,分别用来序列化和反序列化二叉树。这里没有规定序列化的方式

# 层次遍历后结果之按字输出
# 分析

其实我们可以借鉴层次遍历时候的思路, 参见剑指Offer--060-把二叉树打印成多行, 我们把层次遍历的结果保存在vector< vector >中每一层保存在一个vector中, 那么我们输出的时候就可以进行调整, 按照之字形输出即可
## 遍历二叉树

其实这道题约定的序列化没有固定的格式, 只要你序列化后的结果, 再反序列化后与原树相同即可,

因此我们可以随意指定自己的格式,

比如空节点用$表示,或则#表示,

然后遍历采用先序, 中序, 后序或者层次都可以,

我们的示例程序中采用空结点用#表示, 结点与结点用逗号,分隔

选择了合适的遍历算法, 那么剩下的问题就是字符串序列和整数权值的相互转换问题
序列化的关键, 其实就是将树的权值(整数)转换为字符串序列, 可以采用ostringstream, sprintf和itoa

反序列化的关键, 则正好相反, 将字符串转换为整数, 可以使用istringstream, sscanf和atoi

0 comments on commit cd7e47e

Please sign in to comment.