i007.cc

i007.cc

优先队列-降维打击

字节跳动的编码技能考核

 

第二题:

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)
}

 

发表回复