こちらは「Excel Sheet Column Number」のPythonによる解答例となっております。この問題は、与えられたExcel表の列名を数値に変換する問題です。
問題
Excelスプレッドシートで、AからZ、AAからAZ、BAからBZ、…、ZZ、AAA、AAB、…というように、列は次のように表されます。列名が与えられた場合、その列が表す番号を返します。
解法
Excelの列名を数字に変換する方法は、それぞれの文字を26進数で考えることです。たとえば、AAの場合、Aは1、Bは2、…、Zは26として、A*26 + A = 27となります。この問題は、これを応用して解くことができます。
アルゴリズムの概要を以下に述べます。
- 初期値を0に設定します。
- 文字列を1文字ずつ反復処理します。
- 各文字を26進数として計算し、初期値に加算します。
- 次の文字に移動します。
- 最終的な値を返します。
Pythonコード
以下のコードが、「Excel Sheet Column Number」を解くためのPythonプログラムとなります。
### Function ##################################################################
def solve(num=0):
solver = Solution().titleToNumber
if 1 <= num <= Input().input: id_LIST = [num]
else: id_LIST = [id+1 for id in range(Input().input)]
for id in id_LIST:
data = Input(id)
ans = solver(data.columnTitle)
result = "OK" if ans==data.ans else "NG"
print(f"[{str(id).zfill(3)}] {result}")
### Class #####################################################################
class Solution(object):
def titleToNumber(self, columnTitle):
"""
:type columnTitle: str
:rtype: int
"""
num = 0
for char in columnTitle:
num = num * 26 + (ord(char)-ord('A')+1)
return num
# def titleToNumber(self, columnTitle):
# """
# :type columnTitle: str
# :rtype: int
# """
# num = 0
# for id, char in enumerate(columnTitle[::-1]):
# num += 26**id * (ord(char)-ord('A')+1)
# return num
#==============================================================================
class Input:
def __init__(self, num=0):
if num == 1:
self.columnTitle = "A"
self.ans = 1
elif num == 2:
self.columnTitle = "AB"
self.ans = 28
elif num == 3:
self.columnTitle = "ZY"
self.ans = 701
else:
self.input = 3
### Main ######################################################################
if __name__ == "__main__":
solve()
###############################################################################