go 实现给定列号,找到其对应的Excel列名。

发布于 2020-06-01 23:46:10

描述

go 实现给定列号,找到其对应的Excel列名。

excels.go:

package excels

import (
    "bytes"
    "strings"

    "github.com/shomali11/go-interview/strings/reverses/reversestrings"
)

const (
    characterA     = 'A'
    characterZ     = 'Z'
    alphabetsCount = 26
)

// Encode converts a number to an Excel Column Name
func Encode(number int) string {
    var buffer bytes.Buffer
    remainder := 0
    for number > 0 {
        remainder = (number - 1) % alphabetsCount
        buffer.WriteString(string(characterA + remainder))
        number = (number - remainder) / alphabetsCount
    }
    return reversestrings.ReverseString(buffer.String())
}

// Decode converts an Excel Column Name to a number
func Decode(value string) int {
    value = strings.ToUpper(value)
    number := 0
    pow := 1
    for i := len(value) - 1; i >= 0; i-- {
        if value[i] < characterA || value[i] > characterZ {
            continue
        }

        number += (int(value[i]-characterA) + 1) * pow
        pow *= alphabetsCount
    }
    return number

}

测试 excels_test.go:

package excels

import (
    "testing"

    "github.com/stretchr/testify/assert"
)

func TestEncode(t *testing.T) {
    assert.Equal(t, Encode(1), "A")
    assert.Equal(t, Encode(2), "B")
    assert.Equal(t, Encode(26), "Z")
    assert.Equal(t, Encode(27), "AA")
    assert.Equal(t, Encode(100), "CV")
}

func TestDecode(t *testing.T) {
    assert.Equal(t, Decode("A"), 1)
    assert.Equal(t, Decode("B"), 2)
    assert.Equal(t, Decode("Z"), 26)
    assert.Equal(t, Decode("AA"), 27)
    assert.Equal(t, Decode("CV"), 100)
}
0 条评论

发布
问题