Bläddra i källkod

solve conflict

邓心一 7 år sedan
förälder
incheckning
f920a2b523
47 ändrade filer med 351 tillägg och 234 borttagningar
  1. 25 0
      .eslintrc.json
  2. 2 0
      .gitignore
  3. 5 2
      easy/141.js
  4. 6 3
      easy/160.js
  5. 5 2
      easy/190.js
  6. 11 5
      easy/191.js
  7. 2 3
      medium/12.go
  8. 2 3
      medium/15.go
  9. 2 3
      medium/16.go
  10. 2 5
      medium/17.go
  11. 4 5
      medium/18.go
  12. 3 6
      medium/19.go
  13. 6 9
      medium/2.go
  14. 2 6
      medium/22.go
  15. 6 8
      medium/24.go
  16. 4 5
      medium/29.go
  17. 4 8
      medium/31.go
  18. 2 6
      medium/33.go
  19. 2 6
      medium/34.go
  20. 2 6
      medium/36.go
  21. 2 3
      medium/39.go
  22. 2 3
      medium/40.go
  23. 113 3
      medium/43.go
  24. 2 5
      medium/46.go
  25. 4 6
      medium/47.go
  26. 2 6
      medium/48.go
  27. 3 4
      medium/49.go
  28. 2 6
      medium/5.go
  29. 2 6
      medium/50.go
  30. 2 6
      medium/54.go
  31. 2 2
      medium/55.go
  32. 4 5
      medium/56.go
  33. 2 6
      medium/59.go
  34. 2 6
      medium/6.go
  35. 4 8
      medium/60.go
  36. 6 10
      medium/61.go
  37. 2 6
      medium/62.go
  38. 2 6
      medium/63.go
  39. 4 4
      medium/64.go
  40. 2 3
      medium/71.go
  41. 2 5
      medium/73.go
  42. 2 6
      medium/74.go
  43. 2 6
      medium/75.go
  44. 4 7
      medium/77.go
  45. 2 6
      medium/78.go
  46. 2 4
      medium/79.go
  47. 76 5
      medium/8.go

+ 25 - 0
.eslintrc.json

@@ -0,0 +1,25 @@
+{
+    "env": {
+        "browser": true,
+        "es6": true
+    },
+    "extends": "eslint:recommended",
+    "rules": {
+        "indent": [
+            "error",
+            4
+        ],
+        "linebreak-style": [
+            "error",
+            "unix"
+        ],
+        "quotes": [
+            "error",
+            "single"
+        ],
+        "semi": [
+            "error",
+            "never"
+        ]
+    }
+}

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+.vscode
+node_modules

+ 5 - 2
easy/141.js

@@ -1,3 +1,5 @@
+'use strict'
+
 /**
  * Definition for singly-linked list.
  * function ListNode(val) {
@@ -7,8 +9,8 @@
  */
 
 function ListNode(val) {
-    this.val = val;
-    this.next = null;
+    this.val = val
+    this.next = null
 }
 
 /**
@@ -41,6 +43,7 @@ function __main__() {
     n23.next = n2
     n2.next = n22
     n22.next = n23
+    /*eslint no-console: ["error", { allow: ["log"] }] */    
     console.log(hasCycle(n1))
     console.log(hasCycle(n2))
 }

+ 6 - 3
easy/160.js

@@ -1,3 +1,5 @@
+'use strict'
+
 /**
  * Definition for singly-linked list.
  * function ListNode(val) {
@@ -7,8 +9,8 @@
  */
 
 function ListNode(val) {
-    this.val = val;
-    this.next = null;
+    this.val = val
+    this.next = null
 }
 
 /**
@@ -41,7 +43,7 @@ var getIntersectionNode = function (headA, headB) {
         curr = curr.next
     }
     return null
-};
+}
 
 function __main__() {
     let n2 = new ListNode(2)
@@ -58,6 +60,7 @@ function __main__() {
     n12.next = n13
     n24.next = n12
     let n3 = new ListNode(3)
+    /*eslint no-console: ["error", { allow: ["log"] }] */
     console.log(getIntersectionNode(n1, n2))
     console.log(getIntersectionNode(n2, n3))
 }

+ 5 - 2
easy/190.js

@@ -1,3 +1,5 @@
+'use strict'
+
 /**
  * @param {number} n - a positive integer
  * @return {number} - a positive integer
@@ -12,7 +14,7 @@ var reverseBitsOld = function (n) {
         res += last
     }
     return res >>> 0
-};
+}
 
 // [note] in js, signed -> unsigned: n >>> 0
 var reverseBits = function (n) {
@@ -22,9 +24,10 @@ var reverseBits = function (n) {
         n ^= bit << i
     }
     return n >>> 0
-};
+}
 
 function __main__() {
+    /*eslint no-console: ["error", { allow: ["log"] }] */    
     console.log(reverseBits(4294967295))
     console.log(reverseBits(43261596))
     console.log(reverseBits(1))

+ 11 - 5
easy/191.js

@@ -1,19 +1,25 @@
+'use strict'
+
 /**
  * @param {number} n - a positive integer
  * @return {number}
  */
 var hammingWeightOld = function (n) {
     let res = 0
-    for (let i = 0; i < 32; i++, res += n & 1, n >>= 1) {}
+    for (let i = 0; i < 32; i++) {
+        res += n & 1
+        n >>= 1
+    }
     return res
-};
+}
 
-// simple solution using build-in
+// simple solution using built-in
 var hammingWeight = function (n) {
-    return (n).toString(2).replace(/0/g, '').length;
-};
+    return (n).toString(2).replace(/0/g, '').length
+}
 
 function __main__() {
+    /*eslint no-console: ["error", { allow: ["log"] }] */
     console.log(hammingWeight(0xFFFFFFFF))
     console.log(hammingWeightOld(0xFFFFFFFF))
 }

+ 2 - 3
medium/12.go

@@ -2,7 +2,6 @@ package main
 
 import (
 	"bytes"
-	"fmt"
 	"math"
 )
 
@@ -74,6 +73,6 @@ func intToRoman(num int) string {
 	return res.String()
 }
 
-func main() {
+/* func main() {
 	fmt.Println(intToRoman(1998))
-}
+} */

+ 2 - 3
medium/15.go

@@ -1,7 +1,6 @@
 package main
 
 import (
-	"fmt"
 	"sort"
 )
 
@@ -59,7 +58,7 @@ func threeSum(nums []int) [][]int {
 	return res
 }
 
-func main() {
+/* func main() {
 	a1 := []int{-1, 0, 1, 2, -1, -4}
 	fmt.Println(threeSum(a1))
 
@@ -68,4 +67,4 @@ func main() {
 
 	a3 := []int{0, 0, 0}
 	fmt.Println(threeSum(a3))
-}
+} */

+ 2 - 3
medium/16.go

@@ -1,7 +1,6 @@
 package main
 
 import (
-	"fmt"
 	"sort"
 )
 
@@ -39,7 +38,7 @@ func threeSumClosest(nums []int, target int) int {
 	return res
 }
 
-func main() {
+/* func main() {
 	a1 := []int{-1, 0, 1, 2, -1, -4}
 	fmt.Println(threeSumClosest(a1, 0))
 
@@ -48,4 +47,4 @@ func main() {
 
 	a3 := []int{1, 1, 1, 0}
 	fmt.Println(threeSumClosest(a3, 100))
-}
+} */

+ 2 - 5
medium/17.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 var mBtn = map[byte][]string{
 	'2': {"a", "b", "c"},
 	'3': {"d", "e", "f"},
@@ -36,7 +32,8 @@ func letterCombinations(digits string) []string {
 	return letterCombinationsIter(digits[1:], mBtn[digits[0]])
 }
 
-func main() {
+/* func main() {
 	fmt.Println(letterCombinations("23"))
 	fmt.Println(letterCombinations("234"))
 }
+*/

+ 4 - 5
medium/18.go

@@ -1,11 +1,10 @@
 package main
 
 import (
-	"fmt"
 	"sort"
 )
 
-func threeSum(nums []int, target int) [][]int {
+func threeSumForTarget(nums []int, target int) [][]int {
 	if len(nums) < 3 {
 		return [][]int{}
 	}
@@ -44,7 +43,7 @@ func fourSum(nums []int, target int) [][]int {
 		if i > 0 && nums[i] == nums[i-1] {
 			continue
 		}
-		tmp := threeSum(nums[i+1:], target-nums[i])
+		tmp := threeSumForTarget(nums[i+1:], target-nums[i])
 		for _, v := range tmp {
 			res = append(res, append([]int{nums[i]}, v...))
 		}
@@ -52,7 +51,7 @@ func fourSum(nums []int, target int) [][]int {
 	return res
 }
 
-func main() {
+/* func main() {
 	a1 := []int{1, 0, -1, 0, -2, 2}
 	fmt.Println(fourSum(a1, 0))
-}
+} */

+ 3 - 6
medium/19.go

@@ -1,9 +1,6 @@
 package main
 
-import (
-	"fmt"
-)
-
+// ListNode ...
 type ListNode struct {
 	Val  int
 	Next *ListNode
@@ -42,7 +39,7 @@ func removeNthFromEnd(head *ListNode, n int) *ListNode {
 	return head
 }
 
-func main() {
+/* func main() {
 	l15 := ListNode{5, nil}
 	l14 := ListNode{4, &l15}
 	l13 := ListNode{3, &l14}
@@ -52,4 +49,4 @@ func main() {
 	l22 := ListNode{2, nil}
 	l2 := &ListNode{1, &l22}
 	fmt.Println(list2str(removeNthFromEnd(l2, 2)))
-}
+} */

+ 6 - 9
medium/2.go

@@ -1,15 +1,12 @@
 package main
 
-import (
-	"fmt"
-)
-
-type ListNode struct {
+/* type ListNode struct {
 	Val  int
 	Next *ListNode
 }
+*/
 
-func list2str(head *ListNode) string {
+/* func list2str(head *ListNode) string {
 	curr := head
 	str := make([]rune, 0)
 	for curr != nil {
@@ -18,7 +15,7 @@ func list2str(head *ListNode) string {
 	}
 	return string(str)
 }
-
+*/
 func list2int(head *ListNode) int64 {
 	beg := head
 	res := int64(0)
@@ -92,7 +89,7 @@ func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
 	return head
 }
 
-func main() {
+/* func main() {
 	l13 := ListNode{3, nil}
 	l12 := ListNode{2, &l13}
 	l1 := &ListNode{1, &l12}
@@ -100,4 +97,4 @@ func main() {
 	l22 := ListNode{9, &l23}
 	l2 := &ListNode{1, &l22}
 	fmt.Println(list2str(addTwoNumbers(l1, l2)))
-}
+} */

+ 2 - 6
medium/22.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 func generateParenthesisIter(last string, left, right, goal int, res *[]string) {
 	if right == goal {
 		*res = append(*res, last)
@@ -23,6 +19,6 @@ func generateParenthesis(n int) []string {
 	return *res
 }
 
-func main() {
+/* func main() {
 	fmt.Println(generateParenthesis(3))
-}
+} */

+ 6 - 8
medium/24.go

@@ -1,13 +1,11 @@
 package main
 
-import "fmt"
-
-type ListNode struct {
+/* type ListNode struct {
 	Val  int
 	Next *ListNode
-}
+} */
 
-func list2str(head *ListNode) string {
+/* func list2str(head *ListNode) string {
 	curr := head
 	str := make([]rune, 0)
 	for curr != nil {
@@ -15,7 +13,7 @@ func list2str(head *ListNode) string {
 		curr = curr.Next
 	}
 	return string(str)
-}
+} */
 
 /**
  * Definition for singly-linked list.
@@ -67,7 +65,7 @@ func swapPairs(head *ListNode) *ListNode {
 	return dummy.Next
 }
 
-func main() {
+/* func main() {
 	l15 := ListNode{5, nil}
 	l14 := ListNode{4, &l15}
 	l13 := ListNode{3, &l14}
@@ -82,4 +80,4 @@ func main() {
 	l3 := &ListNode{1, &l32}
 	fmt.Println(list2str(swapPairs(l3)))
 	fmt.Println(list2str(swapPairs(&ListNode{1, nil})))
-}
+} */

+ 4 - 5
medium/29.go

@@ -1,16 +1,15 @@
 package main
 
 import (
-	"fmt"
 	"math"
 )
 
-func abs(x int) int {
+/* func abs(x int) int {
 	if x < 0 {
 		return -x
 	}
 	return x
-}
+} */
 
 // time out
 func divideOld(dividend int, divisor int) int {
@@ -56,10 +55,10 @@ func divide(dividend int, divisor int) int {
 	return res
 }
 
-func main() {
+/* func main() {
 	fmt.Println(divide(-1, 1))
 	fmt.Println(divide(-1, -1))
 	fmt.Println(divide(-1<<31, -1))
 	fmt.Println(divide(1, 1))
 	fmt.Println(divide(535, 1))
-}
+} */

+ 4 - 8
medium/31.go

@@ -1,11 +1,7 @@
 package main
 
-import (
-	"fmt"
-)
-
 // “字典序”
-func nextPermutation(nums []int) {
+/* func nextPermutation(nums []int) {
 	if len(nums) < 2 {
 		return
 	}
@@ -28,9 +24,9 @@ func nextPermutation(nums []int) {
 	for l, r := i+1, len(nums)-1; l < r; l, r = l+1, r-1 {
 		nums[l], nums[r] = nums[r], nums[l]
 	}
-}
+} */
 
-func main() {
+/* func main() {
 	a1 := []int{1, 2, 3}
 	a2 := []int{3, 2, 1}
 	a3 := []int{2, 3, 1}
@@ -43,4 +39,4 @@ func main() {
 	fmt.Println(a2)
 	fmt.Println(a3)
 	fmt.Println(a4)
-}
+} */

+ 2 - 6
medium/33.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 func searchOld(nums []int, target int) int {
 	for i, v := range nums {
 		if v == target {
@@ -48,9 +44,9 @@ func search(nums []int, target int) int {
 	return -1
 }
 
-func main() {
+/* func main() {
 	a1 := []int{4, 5, 6, 0, 1, 2, 3}
 	a2 := []int{1, 3}
 	fmt.Println(search(a1, 6))
 	fmt.Println(search(a2, 3))
-}
+} */

+ 2 - 6
medium/34.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 // important
 func searchRange(nums []int, target int) []int {
 	beg, end := 0, len(nums)-1
@@ -35,7 +31,7 @@ func searchRange(nums []int, target int) []int {
 	return res
 }
 
-func main() {
+/* func main() {
 	a1 := []int{1, 2, 3, 4, 4, 4, 5, 6, 7, 8, 9, 10}
 	fmt.Println(searchRange(a1, 4))
 	fmt.Println(searchRange(a1, 5))
@@ -45,4 +41,4 @@ func main() {
 	a2 := []int{5, 7, 7, 8, 8, 10}
 	fmt.Println(searchRange(a2, 8))
 	fmt.Println(searchRange([]int{}, 9))
-}
+} */

+ 2 - 6
medium/36.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 // 1 -> has this value
 var mDigit = map[byte]uint{
 	'.': 0x000,
@@ -77,7 +73,7 @@ func isValidSudoku(board [][]byte) bool {
 	return true
 }
 
-func main() {
+/* func main() {
 	b1 := [][]byte{
 		{'.', '8', '7', '6', '5', '4', '3', '2', '1'},
 		{'2', '.', '.', '.', '.', '.', '.', '.', '.'},
@@ -90,4 +86,4 @@ func main() {
 		{'9', '.', '.', '.', '.', '.', '.', '.', '.'},
 	}
 	fmt.Println(isValidSudoku(b1))
-}
+} */

+ 2 - 3
medium/39.go

@@ -1,7 +1,6 @@
 package main
 
 import (
-	"fmt"
 	"sort"
 )
 
@@ -26,7 +25,7 @@ func combinationSum(candidates []int, target int) [][]int {
 	return res
 }
 
-func main() {
+/* func main() {
 	a1 := []int{2, 3, 6, 7}
 	fmt.Println(combinationSum(a1, 7))
 	a2 := []int{1, 2}
@@ -35,4 +34,4 @@ func main() {
 	fmt.Println(combinationSum(a3, 11))
 	a4 := []int{7, 3, 2}
 	fmt.Println(combinationSum(a4, 18))
-}
+} */

+ 2 - 3
medium/40.go

@@ -1,7 +1,6 @@
 package main
 
 import (
-	"fmt"
 	"sort"
 )
 
@@ -29,7 +28,7 @@ func combinationSum2(candidates []int, target int) [][]int {
 	return res
 }
 
-func main() {
+/* func main() {
 	a1 := []int{10, 1, 2, 7, 6, 1, 5}
 	fmt.Println(combinationSum2(a1, 8))
-}
+} */

+ 113 - 3
medium/43.go

@@ -1,12 +1,122 @@
 package main
 
+import (
+	"fmt"
+	"strconv"
+)
+
+// length < 110, non-negative
 func multiply(num1 string, num2 string) string {
-	i, j := len(num1)-1, len(num2)
-	for ; ; i, j = i-1, j-1 {
+	if num1 == "0" || num2 == "0" {
+		return "0"
+	}
+	if num1 == "1" {
+		return num2
+	} else if num2 == "1" {
+		return num1
+	}
+	n1 := str2IntSlice(num1)
+	n2 := str2IntSlice(num2)
+	sum := []int{}
+	if len(n1) < len(n2) {
+		n1, n2 = n2, n1
+	}
+	for index, num := range n2 {
+		product := intSliceMulInt(n1, num)
+		zeros := make([]int, len(n2)-1-index)
+		product = append(product, zeros...)
+		sum = addIntSlice(sum, product)
+	}
+	return intSlice2Str(sum)
+}
 
+func str2IntSlice(str string) []int {
+	res := []int{}
+	for _, char := range str {
+		res = append(res, int(char-'0'))
 	}
+	return res
 }
 
-func main() {
+func intSlice2Str(slice []int) string {
+	str := []rune{}
+	for _, i := range slice {
+		str = append(str, rune(i+'0'))
+	}
+	return string(str)
+}
 
+func addIntSlice(slice1, slice2 []int) []int {
+	if len(slice1) < len(slice2) {
+		slice1, slice2 = slice2, slice1
+	}
+	if len(slice2) == 0 || (len(slice2) == 1 && slice2[0] == 0) {
+		return slice1
+	}
+	res := make([]int, len(slice1)+1)
+	carry := 0
+	for offset := 0; offset < len(slice1); offset++ {
+		var digit, digit1, digit2 int
+		if offset < len(slice2) {
+			digit1 = slice1[len(slice1)-1-offset]
+			digit2 = slice2[len(slice2)-1-offset]
+		} else if offset < len(slice1) {
+			digit1 = slice1[len(slice1)-1-offset]
+			digit2 = 0
+		} else {
+			digit1, digit2 = 0, 0
+		}
+		digit, carry = addByDigit(digit1, digit2, carry)
+		res[len(res)-1-offset] = digit
+	}
+	if carry == 0 {
+		return res[1:]
+	}
+	res[0] = carry
+	return res
 }
+
+func intSliceMulInt(slice []int, num int) []int {
+	if num == 0 || len(slice) == 0 || (len(slice) == 1 && slice[0] == 0) {
+		return []int{0}
+	}
+	if num == 1 {
+		return slice
+	}
+	res := make([]int, len(slice)+1)
+	carry := 0
+	for offset := 0; offset < len(slice); offset++ {
+		digit := slice[len(slice)-1-offset]
+		digit, carry = mulByDigit(digit, num, carry)
+		res[len(res)-1-offset] = digit
+	}
+	if carry == 0 {
+		return res[1:]
+	}
+	res[0] = carry
+	return res
+}
+
+func mulByDigit(digit1, digit2, lastCarry int) (digit, carry int) {
+	digit = digit1*digit2 + lastCarry
+	carry = digit / 10
+	return digit % 10, carry
+}
+
+func addByDigit(digit1, digit2, lastCarry int) (digit, carry int) {
+	digit = digit1 + digit2 + lastCarry
+	carry = digit / 10
+	return digit % 10, carry
+}
+
+func testMultiply(num1 string, num2 string) {
+	n1, _ := strconv.Atoi(num1)
+	n2, _ := strconv.Atoi(num2)
+	fmt.Printf("%s * %s = %s | %d\n", num1, num2, multiply(num1, num2), n1*n2)
+	slice := str2IntSlice("12347876")
+	intSlice2Str(slice)
+}
+
+/* func main() {
+	testMultiply("782", "3908982")
+} */

+ 2 - 5
medium/46.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 func nextPermutation(nums []int) {
 	if len(nums) < 2 {
 		return
@@ -50,7 +46,8 @@ func permute(nums []int) [][]int {
 	return res
 }
 
-func main() {
+/* func main() {
 	a1 := []int{1, 2, 3}
 	fmt.Println(permute(a1))
 }
+*/

+ 4 - 6
medium/47.go

@@ -1,8 +1,6 @@
 package main
 
-import "fmt"
-
-func nextPermutation(nums []int) {
+/* func nextPermutation(nums []int) {
 	if len(nums) < 2 {
 		return
 	}
@@ -25,7 +23,7 @@ func nextPermutation(nums []int) {
 	for l, r := i+1, len(nums)-1; l < r; l, r = l+1, r-1 {
 		nums[l], nums[r] = nums[r], nums[l]
 	}
-}
+} */
 
 func isEqual(a, b []int) bool {
 	for i, v := range b {
@@ -56,7 +54,7 @@ func permuteUnique(nums []int) [][]int {
 	return res
 }
 
-func main() {
+/* func main() {
 	a1 := []int{1, 1, 2, 3}
 	fmt.Println(permuteUnique(a1))
-}
+} */

+ 2 - 6
medium/48.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 /**
  * '1' 2 '3'  swap   '7' 2 '1'  next   7 '2' 1
  *  4  5  6  ----->   4  5  6  -----> '4' 5 '6' -> ...
@@ -18,7 +14,7 @@ func rotate(matrix [][]int) {
 	}
 }
 
-func main() {
+/* func main() {
 	m1 := [][]int{
 		{11, 22, 33, 44, 55},
 		{16, 27, 38, 49, 50},
@@ -37,4 +33,4 @@ func main() {
 	m3 := [][]int{}
 	rotate(m3)
 	fmt.Println(m3)
-}
+} */

+ 3 - 4
medium/49.go

@@ -1,7 +1,6 @@
 package main
 
 import (
-	"fmt"
 	"sort"
 )
 
@@ -17,7 +16,7 @@ func groupAnagrams(strs []string) (res [][]string) {
 	m := map[string]int{}
 	for _, v := range strs {
 		runes := []rune(v)
-		sort.Sort([]int(runes))
+		sort.Sort(RuneSlice(runes))
 		if idx, ok := m[string(runes)]; !ok {
 			m[string(runes)] = len(m)
 			res = append(res, []string{v})
@@ -28,9 +27,9 @@ func groupAnagrams(strs []string) (res [][]string) {
 	return res
 }
 
-func main() {
+/* func main() {
 	a1 := []string{"eat", "tea", "tan", "ate", "nat", "bat"}
 	fmt.Println(groupAnagrams(a1))
 	a2 := []string{}
 	fmt.Println(groupAnagrams(a2))
-}
+} */

+ 2 - 6
medium/5.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 func longestPalindrome(s string) string {
 	n := len(s)
 	if n < 2 {
@@ -28,9 +24,9 @@ func longestPalindrome(s string) string {
 	return s[maxBeg : maxEnd+1]
 }
 
-func main() {
+/* func main() {
 	fmt.Println(longestPalindrome("ASDFDSAASBUGAYFUYFSDG"))
 	fmt.Println(longestPalindrome("A"))
 	fmt.Println(longestPalindrome(""))
 	fmt.Println(longestPalindrome("gigiudhfafhsaoifhoifaochasiofueosanfklf"))
-}
+} */

+ 2 - 6
medium/50.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 func myPow(x float64, n int) float64 {
 	if n < 0 {
 		n = -n
@@ -18,6 +14,6 @@ func myPow(x float64, n int) float64 {
 	return res
 }
 
-func main() {
+/* func main() {
 	fmt.Println(myPow(2.0, -10))
-}
+} */

+ 2 - 6
medium/54.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 func spiralOrder(matrix [][]int) (res []int) {
 	if len(matrix) == 0 {
 		return
@@ -50,7 +46,7 @@ func spiralOrder(matrix [][]int) (res []int) {
 	return
 }
 
-func main() {
+/* func main() {
 	m1 := [][]int{
 		{11, 22, 33, 44, 55},
 		{16, 27, 38, 49, 50},
@@ -72,4 +68,4 @@ func main() {
 		{11},
 	}
 	fmt.Println(spiralOrder(m3))
-}
+} */

+ 2 - 2
medium/55.go

@@ -37,11 +37,11 @@ func canJump(nums []int) bool {
 	return true
 }
 
-func main() {
+/* func main() {
 	a1 := []int{2, 3, 1, 1, 4}
 	a2 := []int{3, 2, 1, 0, 4}
 	a3 := []int{0}
 	fmt.Println(canJump(a1))
 	fmt.Println(canJump(a2))
 	fmt.Println(canJump(a3))
-}
+} */

+ 4 - 5
medium/56.go

@@ -1,7 +1,6 @@
 package main
 
 import (
-	"fmt"
 	"sort"
 )
 
@@ -92,12 +91,12 @@ func startValue(p, q *Interval) bool {
 	return p.Start < q.Start
 }
 
-func maxInt(x, y int) int {
+/* func maxInt(x, y int) int {
 	if x > y {
 		return x
 	}
 	return y
-}
+} */
 
 /**
  * Definition for an interval.
@@ -122,7 +121,7 @@ func merge(intervals []Interval) (res []Interval) {
 	return
 }
 
-func main() {
+/* func main() {
 	i1 := []Interval{{1, 3}, {2, 6}, {8, 10}, {15, 18}}
 	i2 := []Interval{}
 	i3 := []Interval{{1, 4}, {4, 5}, {5, 6}}
@@ -131,4 +130,4 @@ func main() {
 	fmt.Println(merge(i2))
 	fmt.Println(merge(i3))
 	fmt.Println(merge(i4))
-}
+} */

+ 2 - 6
medium/59.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 func generateMatrix(n int) [][]int {
 	res := make([][]int, n)
 	for i := range res {
@@ -38,10 +34,10 @@ func generateMatrix(n int) [][]int {
 	return res
 }
 
-func main() {
+/* func main() {
 	fmt.Println(generateMatrix(0))
 	fmt.Println(generateMatrix(1))
 	fmt.Println(generateMatrix(2))
 	fmt.Println(generateMatrix(3))
 	fmt.Println(generateMatrix(4))
-}
+} */

+ 2 - 6
medium/6.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 func convert(s string, numRows int) string {
 	n := len(s)
 	if n < 3 || numRows == 1 {
@@ -26,8 +22,8 @@ func convert(s string, numRows int) string {
 	return string(res)
 }
 
-func main() {
+/* func main() {
 	fmt.Println(convert("PAYPALISHIRING", 3))
 	fmt.Println(convert("ABCDE", 4))
 	fmt.Println("PAHNAPLSIIGYIR")
-}
+} */

+ 4 - 8
medium/60.go

@@ -1,10 +1,6 @@
 package main
 
-import (
-	"fmt"
-)
-
-func nextPermutation(runes []rune) {
+func nextPermutationRune(runes []rune) {
 	if len(runes) < 2 {
 		return
 	}
@@ -31,7 +27,7 @@ func getPermutationOld(n int, k int) string {
 		res = append(res, rune('0'+i))
 	}
 	for i := 1; i < k; i++ {
-		nextPermutation(res)
+		nextPermutationRune(res)
 	}
 	return string(res)
 }
@@ -68,9 +64,9 @@ func fact(x int) int {
 	return x * fact(x-1)
 }
 
-func main() {
+/* func main() {
 	fmt.Println(getPermutationOld(4, 16))
 	fmt.Println(getPermutation(4, 16))
 	fmt.Println(getPermutation(1, 16))
 	fmt.Println(getPermutation(0, 16))
-}
+} */

+ 6 - 10
medium/61.go

@@ -1,16 +1,12 @@
 package main
 
-import (
-	"fmt"
-)
-
 // ListNode ...
-type ListNode struct {
+/* type ListNode struct {
 	Val  int
 	Next *ListNode
-}
+} */
 
-func list2str(head *ListNode) string {
+/* func list2str(head *ListNode) string {
 	curr := head
 	str := make([]rune, 0)
 	for curr != nil {
@@ -18,7 +14,7 @@ func list2str(head *ListNode) string {
 		curr = curr.Next
 	}
 	return string(str)
-}
+} */
 
 /**
  * Definition for singly-linked list.
@@ -57,7 +53,7 @@ func rotateRight(head *ListNode, k int) *ListNode {
 	return dummy.Next
 }
 
-func main() {
+/* func main() {
 	l16 := ListNode{6, nil}
 	l15 := ListNode{5, &l16}
 	l14 := ListNode{4, &l15}
@@ -73,4 +69,4 @@ func main() {
 	fmt.Println(list2str(rotateRight(&l13, 5)))
 	fmt.Println(list2str(rotateRight(&l14, 6)))
 	fmt.Println(list2str(rotateRight(&l14, 7)))
-}
+} */

+ 2 - 6
medium/62.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 func uniquePaths(m int, n int) int {
 	if m == 1 || n == 1 {
 		return 1
@@ -24,8 +20,8 @@ func uniquePaths(m int, n int) int {
 	return grid[m-1][n-1]
 }
 
-func main() {
+/* func main() {
 	fmt.Println(uniquePaths(1, 1))
 	fmt.Println(uniquePaths(1, 2))
 	fmt.Println(uniquePaths(3, 7))
-}
+} */

+ 2 - 6
medium/63.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 func uniquePathsWithObstacles(obstacleGrid [][]int) int {
 	m, n := len(obstacleGrid), len(obstacleGrid[0])
 	// only one row/col
@@ -51,7 +47,7 @@ func uniquePathsWithObstacles(obstacleGrid [][]int) int {
 	return grid[m-1][n-1]
 }
 
-func main() {
+/* func main() {
 	o1 := [][]int{
 		{0, 0, 0},
 		{0, 1, 0},
@@ -64,4 +60,4 @@ func main() {
 		{0, 0, 0},
 	}
 	fmt.Println(uniquePathsWithObstacles(o2))
-}
+} */

+ 4 - 4
medium/64.go

@@ -4,12 +4,12 @@ import (
 	"fmt"
 )
 
-func minInt(x, y int) int {
+/* func minInt(x, y int) int {
 	if x < y {
 		return x
 	}
 	return y
-}
+} */
 
 func minPathSumOld(grid [][]int) int {
 	m, n := len(grid), len(grid[0])
@@ -53,11 +53,11 @@ func minPathSum(grid [][]int) int {
 	return grid[m-1][n-1]
 }
 
-func main() {
+/* func main() {
 	g1 := [][]int{
 		{1, 3, 1},
 		{1, 5, 1},
 		{4, 2, 1},
 	}
 	fmt.Println(minPathSum(g1))
-}
+} */

+ 2 - 3
medium/71.go

@@ -1,7 +1,6 @@
 package main
 
 import (
-	"fmt"
 	"strings"
 )
 
@@ -29,8 +28,8 @@ func simplifyPath(path string) string {
 	return strings.Join(res, "/")
 }
 
-func main() {
+/* func main() {
 	fmt.Println(simplifyPath("/c/"))
 	fmt.Println(simplifyPath("/a/./b/../../c/"))
 	fmt.Println(simplifyPath("/../../"))
-}
+} */

+ 2 - 5
medium/73.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 func setZeroes(matrix [][]int) {
 	// Can use type 'map[int]struct{}' instead,
 	// and insert empty struct like 'struct{}{}'.
@@ -26,7 +22,7 @@ func setZeroes(matrix [][]int) {
 	}
 }
 
-func main() {
+/* func main() {
 	m1 := [][]int{
 		{0, 2, 4, 6},
 		{1, 3, 4, 5},
@@ -36,3 +32,4 @@ func main() {
 	setZeroes(m1)
 	fmt.Println(m1)
 }
+*/

+ 2 - 6
medium/74.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 func searchMatrix(matrix [][]int, target int) bool {
 	if len(matrix) == 0 || len(matrix[0]) == 0 {
 		return false
@@ -24,7 +20,7 @@ func searchMatrix(matrix [][]int, target int) bool {
 	return false
 }
 
-func main() {
+/* func main() {
 	m1 := [][]int{
 		{1, 3, 6, 8},
 		{9, 13, 53, 76},
@@ -34,4 +30,4 @@ func main() {
 	fmt.Println(searchMatrix(m1, 987))
 	fmt.Println(searchMatrix(m1, 97))
 	fmt.Println(searchMatrix(m1, 1))
-}
+} */

+ 2 - 6
medium/75.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 // ?? check the best solution the next time
 func sortColors(nums []int) {
 	mCnt := [3]int{}
@@ -18,9 +14,9 @@ func sortColors(nums []int) {
 	}
 }
 
-func main() {
+/* func main() {
 	c1 := []int{0, 1, 1, 2, 0, 0, 1, 2, 1}
 	sortColors(c1)
 	fmt.Println(c1)
 	sortColors([]int{})
-}
+} */

+ 4 - 7
medium/77.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 func combinIter(n int, k int, last []int, res *[][]int) {
 	solution := make([]int, len(last))
 	copy(solution, last)
@@ -28,7 +24,7 @@ func combineOld(n int, k int) (res [][]int) {
 }
 
 // a cleaner way of recursion
-func combine(n int, k int) (res [][]int) {
+/* func combine(n int, k int) (res [][]int) {
 	// Cnn or C0n
 	if n == k || k == 0 {
 		row := make([]int, k)
@@ -44,10 +40,11 @@ func combine(n int, k int) (res [][]int) {
 	}
 	res = append(res, combine(n-1, k)...)
 	return
-}
+} */
 
-func main() {
+/* func main() {
 	fmt.Println(combine(4, 2))
 	fmt.Println(combine(5, 4))
 	fmt.Println(combine(1, 1))
 }
+*/

+ 2 - 6
medium/78.go

@@ -1,9 +1,5 @@
 package main
 
-import (
-	"fmt"
-)
-
 func combine(nums []int, k int) (res [][]int) {
 	n := len(nums)
 	if n == k || k == 0 {
@@ -29,7 +25,7 @@ func subsets(nums []int) (res [][]int) {
 	return
 }
 
-func main() {
+/* func main() {
 	a1 := []int{1, 2, 3}
 	fmt.Println(subsets(a1))
-}
+} */

+ 2 - 4
medium/79.go

@@ -1,7 +1,5 @@
 package main
 
-import "fmt"
-
 // Pos stands for the position of board[y][x]
 type Pos struct {
 	x int
@@ -72,7 +70,7 @@ func exist(board [][]byte, word string) bool {
 	return false
 }
 
-func main() {
+/* func main() {
 	b1 := [][]byte{
 		{'A', 'B', 'C', 'E'},
 		{'S', 'F', 'C', 'S'},
@@ -83,4 +81,4 @@ func main() {
 	fmt.Println(exist(b1, "ABCB"))
 	fmt.Println(exist(b1, "FSADEESCCBA"))
 	fmt.Println(exist(b1, "ZSADEESCCBA"))
-}
+} */

+ 76 - 5
medium/8.go

@@ -2,15 +2,86 @@ package main
 
 import (
 	"fmt"
+	"math"
 	"strings"
 )
 
 func myAtoi(str string) int {
-	str = strings.TrimSpace(str)
-	fmt.Println(str)
-	return 0
+	str = strings.Trim(str, " ")
+	if len(str) == 0 {
+		return 0
+	}
+	chars := []rune(str)
+	beg, end := 0, 0
+	isNegative := false
+	// judge the sign of the integer
+	switch chars[beg] {
+	case '-':
+		isNegative = true
+		fallthrough
+	case '+':
+		beg, end = 1, 1
+		// deal with "+" or "-"
+		if len(str) == 1 {
+			return 0
+		}
+	default:
+		beg, end = 0, 0
+	}
+	// find the first non-zero digit and the last valid digit
+	for ; end <= len(chars); end++ {
+		if chars[beg] == '0' {
+			beg++
+			// for str like "000000000000", return 0
+			if beg == len(chars) {
+				return 0
+			}
+			continue
+		}
+		if end == len(chars) || chars[end] < '0' || '9' < chars[end] {
+			break
+		}
+	}
+	if beg == end {
+		// no valid digit
+		return 0
+	} else if end-beg > 10 { // overflow (MaxInt32 & MinInt32 have 10 digits only)
+		if isNegative {
+			return math.MinInt32
+		}
+		return math.MaxInt32
+	}
+	sum, base := int64(0), int64(1)
+	for ; end > beg; end-- {
+		num := int64(chars[end-1] - '0')
+		sum += num * base
+		base *= int64(10)
+	}
+	if isNegative {
+		sum *= int64(-1)
+	}
+	if sum < math.MinInt32 {
+		return math.MinInt32
+	} else if sum > math.MaxInt32 {
+		return math.MaxInt32
+	}
+	return int(sum)
 }
 
-func main() {
-	myAtoi("   -0.1    ")
+func testMyAtoi(str string) {
+	fmt.Printf("\"%s\" -> %d\n", str, myAtoi(str))
 }
+
+/* func main() {
+	testMyAtoi("")
+	testMyAtoi("       00000000000000000000           ")
+	testMyAtoi("+")
+	testMyAtoi("   -0.1    ")
+	testMyAtoi("   +1.1    ")
+	testMyAtoi("   234.1    ")
+	testMyAtoi("42")
+	testMyAtoi("9223372036854775808")
+	testMyAtoi("   -2.1    ")
+	testMyAtoi("   - 0.1    ")
+	testMyAtoi("   num 0.1    ")
+} */