こちらは「Excel Sheet Column Title」のPythonによる解答例となっております。この問題は、与えられた数値をExcelの列名に変換する問題です。
問題
Excelシートの列番号が与えられたとき、対応する列名を返します。
- 列番号は1から始まります。
- 列名は、1つ以上の大文字アルファベットから構成されます。
- 列名は、AからZ、AAからAZ、BAからBZ、…、AAAからZZZまでの範囲内にあります。
解法
この問題は、余りを利用した再帰的なアプローチがあります。26進数に似た、1から始まる数字をExcelの列名に変換することができます。
アルゴリズムの概要を以下に述べます。
- 10進数の数値を26進数に変換します。
- 余りを計算します。
- 余りから文字を生成します。
- 商を新しい入力として、再帰的に手順1-3を繰り返します。
- 列名を反転して返します。
Pythonコード
以下のコードが、「Excel Sheet Column Title」を解くためのPythonプログラムとなります。
### Function ##################################################################
def solve(num=0):
solver = Solution().convertToTitle
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.columnNumber)
result = "OK" if ans==data.ans else "NG"
print(f"[{str(id).zfill(3)}] {result}")
### Class #####################################################################
class Solution(object):
def convertToTitle(self, columnNumber):
"""
:type columnNumber: int
:rtype: str
"""
capitals = [chr(x) for x in range(ord('A'), ord('Z')+1)]
result = []
while columnNumber > 0:
result.append(capitals[(columnNumber-1)%26])
columnNumber = (columnNumber-1) // 26
result.reverse()
return ''.join(result)
#==============================================================================
class Input:
def __init__(self, num=0):
if num == 1:
self.columnNumber = 1
self.ans = "A"
elif num == 2:
self.columnNumber = 28
self.ans = "AB"
elif num == 3:
self.columnNumber = 701
self.ans = "ZY"
else:
self.input = 3
### Main ######################################################################
if __name__ == "__main__":
solve()
###############################################################################