diff --git "a/012-\346\211\223\345\215\2601\345\210\260\346\234\200\345\244\247\347\232\204N\344\275\215\346\225\260/problem012.go" "b/012-\346\211\223\345\215\2601\345\210\260\346\234\200\345\244\247\347\232\204N\344\275\215\346\225\260/problem012.go" index 6d09858..fd30da3 100644 --- "a/012-\346\211\223\345\215\2601\345\210\260\346\234\200\345\244\247\347\232\204N\344\275\215\346\225\260/problem012.go" +++ "b/012-\346\211\223\345\215\2601\345\210\260\346\234\200\345\244\247\347\232\204N\344\275\215\346\225\260/problem012.go" @@ -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") } diff --git "a/029-\346\225\260\347\273\204\344\270\255\345\207\272\347\216\260\346\254\241\346\225\260\350\266\205\350\277\207\344\270\200\345\215\212\347\232\204\346\225\260\345\255\227/README.md" "b/029-\346\225\260\347\273\204\344\270\255\345\207\272\347\216\260\346\254\241\346\225\260\350\266\205\350\277\207\344\270\200\345\215\212\347\232\204\346\225\260\345\255\227/README.md" index 3551089..e15b5af 100644 --- "a/029-\346\225\260\347\273\204\344\270\255\345\207\272\347\216\260\346\254\241\346\225\260\350\266\205\350\277\207\344\270\200\345\215\212\347\232\204\346\225\260\345\255\227/README.md" +++ "b/029-\346\225\260\347\273\204\344\270\255\345\207\272\347\216\260\346\254\241\346\225\260\350\266\205\350\277\207\344\270\200\345\215\212\347\232\204\346\225\260\345\255\227/README.md" @@ -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来建立数字到出现次数的映射 diff --git "a/030-\346\234\200\345\260\217\347\232\204K\344\270\252\346\225\260/problem030.go" "b/030-\346\234\200\345\260\217\347\232\204K\344\270\252\346\225\260/problem030.go" index 25dabf0..0b74d7d 100644 --- "a/030-\346\234\200\345\260\217\347\232\204K\344\270\252\346\225\260/problem030.go" +++ "b/030-\346\234\200\345\260\217\347\232\204K\344\270\252\346\225\260/problem030.go" @@ -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") @@ -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)) } \ No newline at end of file diff --git "a/049-\346\212\212\345\255\227\347\254\246\344\270\262\350\275\254\346\215\242\346\210\220\346\225\264\346\225\260/problem049.go" "b/049-\346\212\212\345\255\227\347\254\246\344\270\262\350\275\254\346\215\242\346\210\220\346\225\264\346\225\260/problem049.go" index 05bda40..39d8eab 100644 --- "a/049-\346\212\212\345\255\227\347\254\246\344\270\262\350\275\254\346\215\242\346\210\220\346\225\264\346\225\260/problem049.go" +++ "b/049-\346\212\212\345\255\227\347\254\246\344\270\262\350\275\254\346\215\242\346\210\220\346\225\264\346\225\260/problem049.go" @@ -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 @@ -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 { diff --git "a/058-\344\272\214\345\217\211\346\240\221\347\232\204\344\270\213\344\270\200\344\270\252\347\273\223\347\202\271/problem058.go" "b/058-\344\272\214\345\217\211\346\240\221\347\232\204\344\270\213\344\270\200\344\270\252\347\273\223\347\202\271/problem058.go" index 7cd4295..8c15dea 100644 --- "a/058-\344\272\214\345\217\211\346\240\221\347\232\204\344\270\213\344\270\200\344\270\252\347\273\223\347\202\271/problem058.go" +++ "b/058-\344\272\214\345\217\211\346\240\221\347\232\204\344\270\213\344\270\200\344\270\252\347\273\223\347\202\271/problem058.go" @@ -15,7 +15,6 @@ func getNext(node *TreeNode) *TreeNode { if node == nil { return node } - //如果节点有右子树,那么它的下一个节点就是它的右子树中最左边的节点 if node.Right != nil { node = node.Right @@ -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 diff --git "a/061-\346\214\211\344\271\213\345\255\227\345\275\242\351\241\272\345\272\217\346\211\223\345\215\260\344\272\214\345\217\211\346\240\221/README.md" "b/061-\346\214\211\344\271\213\345\255\227\345\275\242\351\241\272\345\272\217\346\211\223\345\215\260\344\272\214\345\217\211\346\240\221/README.md" index 45e2e0d..516632f 100644 --- "a/061-\346\214\211\344\271\213\345\255\227\345\275\242\351\241\272\345\272\217\346\211\223\345\215\260\344\272\214\345\217\211\346\240\221/README.md" +++ "b/061-\346\214\211\344\271\213\345\255\227\345\275\242\351\241\272\345\272\217\346\211\223\345\215\260\344\272\214\345\217\211\346\240\221/README.md" @@ -1,22 +1,8 @@ -# 题目描述 +# 题意 -请实现两个函数,分别用来序列化和反序列化二叉树。这里没有规定序列化的方式 +请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 -# 分析 +# 层次遍历后结果之按字输出 -## 遍历二叉树 +其实我们可以借鉴层次遍历时候的思路, 参见剑指Offer--060-把二叉树打印成多行, 我们把层次遍历的结果保存在vector< vector >中每一层保存在一个vector中, 那么我们输出的时候就可以进行调整, 按照之字形输出即可 -其实这道题约定的序列化没有固定的格式, 只要你序列化后的结果, 再反序列化后与原树相同即可, - -因此我们可以随意指定自己的格式, - -比如空节点用$表示,或则#表示, - -然后遍历采用先序, 中序, 后序或者层次都可以, - -我们的示例程序中采用空结点用#表示, 结点与结点用逗号,分隔 - -选择了合适的遍历算法, 那么剩下的问题就是字符串序列和整数权值的相互转换问题 -序列化的关键, 其实就是将树的权值(整数)转换为字符串序列, 可以采用ostringstream, sprintf和itoa - -反序列化的关键, 则正好相反, 将字符串转换为整数, 可以使用istringstream, sscanf和atoi \ No newline at end of file diff --git "a/062-\345\272\217\345\210\227\345\214\226\344\272\214\345\217\211\346\240\221/README.md" "b/062-\345\272\217\345\210\227\345\214\226\344\272\214\345\217\211\346\240\221/README.md" index 5843b95..45e2e0d 100644 --- "a/062-\345\272\217\345\210\227\345\214\226\344\272\214\345\217\211\346\240\221/README.md" +++ "b/062-\345\272\217\345\210\227\345\214\226\344\272\214\345\217\211\346\240\221/README.md" @@ -1,7 +1,22 @@ -# 题意 +# 题目描述 -请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 +请实现两个函数,分别用来序列化和反序列化二叉树。这里没有规定序列化的方式 -# 层次遍历后结果之按字输出 +# 分析 -其实我们可以借鉴层次遍历时候的思路, 参见剑指Offer--060-把二叉树打印成多行, 我们把层次遍历的结果保存在vector< vector >中每一层保存在一个vector中, 那么我们输出的时候就可以进行调整, 按照之字形输出即可 \ No newline at end of file +## 遍历二叉树 + +其实这道题约定的序列化没有固定的格式, 只要你序列化后的结果, 再反序列化后与原树相同即可, + +因此我们可以随意指定自己的格式, + +比如空节点用$表示,或则#表示, + +然后遍历采用先序, 中序, 后序或者层次都可以, + +我们的示例程序中采用空结点用#表示, 结点与结点用逗号,分隔 + +选择了合适的遍历算法, 那么剩下的问题就是字符串序列和整数权值的相互转换问题 +序列化的关键, 其实就是将树的权值(整数)转换为字符串序列, 可以采用ostringstream, sprintf和itoa + +反序列化的关键, 则正好相反, 将字符串转换为整数, 可以使用istringstream, sscanf和atoi \ No newline at end of file