字节跳动的编码技能考核

第二题:
package main
import (
"fmt"
"strconv"
)
type LinkNode struct {
value int
next *LinkNode
}
func (n *LinkNode) PrintValue() {
for i := n; i != nil; i = i.next {
fmt.Print(i.value)
}
fmt.Print("\n")
}
func (n *LinkNode) GetSize() int {
ret := 0
for node := n; node != nil; node = node.next {
ret++
}
return ret
}
func CreateInt(value int) *LinkNode {
var head *LinkNode = nil
var prevNode *LinkNode = nil
str := fmt.Sprintf("%d", value)
for i := 0; i < len(str); i++ {
intValue, _ := strconv.Atoi(str[i:i+1])
newNode := LinkNode{value:intValue}
if prevNode == nil {
prevNode = &newNode
} else {
prevNode.next = &newNode
prevNode = prevNode.next
}
if head == nil {
head = prevNode
}
}
return head
}
func AddNode(firstInt *LinkNode, secondInt *LinkNode) *LinkNode {
if secondInt.GetSize() > firstInt.GetSize() {
firstInt, secondInt = secondInt, firstInt
}
secondSize := secondInt.GetSize()
secondNode := secondInt
for firstNode := firstInt; firstNode != nil; firstNode = firstNode.next {
if firstNode.GetSize() > secondSize {
continue
}
firstNode.value += secondNode.value
secondNode = secondNode.next
}
return firstInt
}
func main() {
firstInt := CreateInt(1234)
secondInt := CreateInt(34)
firstInt.PrintValue()
secondInt.PrintValue()
ret := AddNode(firstInt, secondInt)
ret.PrintValue()
}
第三题:
package main
import (
"fmt"
)
func FindLeft(waterArray []int, pos int, level int) bool {
for i := 0; i < pos; i++ {
if waterArray[i] >= level {
return true
}
}
return false
}
func FindRight(waterArray []int, pos int, level int) bool {
for i := pos + 1; i < len(waterArray); i++ {
if waterArray[i] >= level {
return true
}
}
return false
}
func main() {
waterArray := []int{0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1}
highestLevel := 0
for i := range waterArray {
if i > highestLevel {
highestLevel = i
}
}
totalWater := 0
for i := 1; i < len(waterArray) - 1; i++ {
for level:= highestLevel; level > waterArray[i]; level-- {
if FindLeft(waterArray, i, level) && FindRight(waterArray, i, level) {
totalWater++
}
}
}
fmt.Println(totalWater)
}
