go 实现给定列号,找到其对应的Excel列名。
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
}
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)
}