Use of Channel
package main
import "golang.org/x/tour/tree"
import "fmt"
// Walk walks the tree t sending all values
// from the tree to the channel ch.
func Walk(t *tree.Tree, ch chan int){
_Walk(t, ch)
close(ch)
}
func _Walk(t *tree.Tree, ch chan int){
if t.Left != nil{
_Walk(t.Left, ch)
}
ch <- t.Value
if t.Right != nil{
_Walk(t.Right, ch)
}
}
// Same determines whether the trees
// t1 and t2 contain the same values.
func Same(t1, t2 *tree.Tree) bool{
c1 := make(chan int)
c2 := make(chan int)
go Walk(t1, c1)
go Walk(t2, c2)
for {
a, ok1 := <- c1
b, ok2 := <- c2
if ok1 != ok2 || a != b{
return false
// end of chan
}else if(ok1 == ok2 && ok1 == false){
return true
}
}
return true
}
func main() {
b := Same(tree.New(2), tree.New(2))
fmt.Println(b)
fmt.Println("End of main")
}
Longest Palindrome
func longestPalindrome(s string) string {
re := ""
for center:= 0; center < len(s); center++{
// check even length
l := center
r := center + 1
for l >= 0 && r < len(s){
if s[l] == s[r]{
l--
r++
}else{
break
}
}
if (r - l - 1 > len(re)){
re = s[l+1:r]
}
// check odd length
l = center - 1
r = center + 1
for l >= 0 && r < len(s){
if s[l] == s[r]{
l--
r++
}else{
break
}
}
if (r - l - 1 > len(re)){
re = s[l+1:r]
}
}
return re
}
Longest Substring Without Repeating Characters
func lengthOfLongestSubstring(s string) int {
isExist := make(map[byte]bool)
head, tail := 0, 0
length := 0
for head < len(s){
if _, ok := isExist[s[head]]; ok{
// occured before
delete(isExist, s[tail])
tail++
}else{
isExist[s[head]] = true
head++
}
if(head - tail > length){
length = head - tail
}
}
return length
}
Allocate space for slices. Use make.
Allocate space for pointer, use new
package main
import "golang.org/x/tour/pic"
func Pic(dx, dy int) [][]uint8 {
var re [][]uint8
re = make([][]uint8, dx)
for i:=0; i < dx; i++{
re[i] = make([]uint8, dy)
for j := 0; j < dy; j++{
re[i][j] = uint8(i ^ j)
}
}
return re
}
func main() {
pic.Show(Pic)
}
Add two numbers
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
lenL1 := getLen(l1)
lenL2 := getLen(l2)
if lenL1 < lenL2{
swap(&l1, &l2)
}
// lengthl1 >= l2
carry := 0
head := l1
var prev *ListNode
for l1 != nil{
var v = 0
if(l2 != nil){
v = l2.Val
l2 = l2.Next
}
l1.Val += carry + v
carry = l1.Val / 10
l1.Val %= 10
prev = l1
l1 = l1.Next
}
if carry != 0{
prev.Next = new(ListNode)
l1 = prev.Next
l1.Val = carry
l1.Next = nil
}
return head
}
func swap(l1, l2 **ListNode){
temp := *l1
*l1 = *l2
*l2 = temp
}
func getLen(l *ListNode) int {
var len = 0
for l != nil{
len++
l = l.Next
}
return len
}
Hash Map
Note: using hash map
// Declare a hash map mymap := make(map[int]int)
Two Sum
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution.
Example:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
func twoSum(nums []int, target int) []int {
mymap := make(map[int]int)
for i, v1 := range nums{
j, ok := mymap[target - v1]
if ok{
return []int{j, i}
}else{
mymap[v1] = i
}
}
return []int{-1,-1}
}