1. 判断链表是否有环,如果有环找到环入口

思路:定义快、慢指针,从链表头开始,快指针每次走两步,慢指针每次走一步,如果相遇,说明有环。碰撞之后慢指针回到链表头部,快慢指针每次走一步,第一次相遇就是环入口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func getLinkCircle(head *Node) *Node {<!-- -->
    fast := head
    last := head
    cur := head
    for cur != nil && cur.Next != nil {<!-- -->
        last = last.Next
        fast = fast.Next.Next
        if last == fast {<!-- --> // 第一次相遇
            break
        }
        cur = cur.Next
    }
    // 没有环
    if fast == nil || last == nil {<!-- -->
        return nil
    }
    last = head
    for last != fast {<!-- -->
        last = last.Next
        fast = fast.Next
    }
    return last
}

2. 在一次选举投票中,有一个候选人的投票超过了50%,在选票中找出这个候选人。

思路:投票法,定义两个变量,一个记录当前候选人编号,一个记录候选人票数。遍历,遇到相同的编号计数加1,不同的减1,为0时,更换候选人编号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func getMaxVoteNum(arr []int) int {<!-- -->
    major := arr[0]
    count := 0
    for i := 0; i < len(arr); i++ {<!-- -->
        if major == arr[i] {<!-- -->
            count++
        } else {<!-- -->
            if count == 0 {<!-- -->
                major = arr[i]
                count++
            } else {<!-- -->
                count--
            }
        }
    }
    return major
}