このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。それでは、問題について説明する。
この問題では、エクセルのシートの列ラベルの生成ルールについて考えている。エクセルのシートの列は、1列目はA、2列目はB、...26列目はZ、27列目はAA、28列目はAB、...702列目はZZという関係がある。何列目かを表す整数型の値column(1~702に限定)が与えられたときに、列を表す文字列を返すというのが問題である。
私の解答はこちら。
public class SpreadsheetColumn { public String getLabel(int column) { int d1 = column / 26; int d2 = column % 26; char c2 = d2 == 0 ? 'Z' : (char) (d2-1+'A'); d1 = d2%26==0 ? d1-1 : d1; if( column > 26 ){ char c1 = d1 == 27 ? 'Z' : (char) (d1-1+'A'); return "" + c1 + c2; }else{ return "" + c2; } } }
正直なところ、結構苦労していました。10進数の0に相当するものがない(Aは1扱いなので)のが、解く際に混乱していた原因です。もっとも、0に相当する文字があれば、簡単すぎる問題になってしまうのでしょうけれど。