Excel sheetのカラム名からカラム番号への変換
シーケンスseq=[a,b,...,z,aa,ab,...,az,ba,bb,...,bz,...,za,zb,...,zz,aaa,...]excelに類似したカラム名が小さいものから大きいものまで順次配列される.任意に1つの文字列s=[a-z]+(a-z文字列からなる任意の長さの文字列)を与え、sがシーケンスseqの数番目の(0-based)文字列であることを返す.第1の解法はもっと理解しやすい.進数変換に相当します.一般的な進数変換とは小さな違いがあります.例えばアルファベットAは最低位で0を表し、他の位では1を表す.他のアルファベットも同じです.だから26進数で変換した後に1を減らす必要があるのがテーマの要求の結果です.
解法1:まず1-basedの下付きを計算し、戻ると1を減らします.注意して、この方法は境界を越えて考えていません.
解法2:0-basedの下付き文字を直接計算します.
解法1:まず1-basedの下付きを計算し、戻ると1を減らします.注意して、この方法は境界を越えて考えていません.
unsigned int ColumnToIndex(const char * const pCol)
{
if (NULL == pCol)
return 0;
unsigned int oneBasedSum = 0;
const char *p = pCol;
while ('\0' != *p)
{
oneBasedSum = ((oneBasedSum*26) + (*p - 'a' + 1));
p++;
}
return oneBasedSum - 1;
}
解法2:0-basedの下付き文字を直接計算します.
unsigned int GetColumnIdx(const char * const pch)
{
unsigned int sum = 0;
char ch;
const char * i = pch;
while (*i != '\0')
{
ch = *i - 'a';
if (i!=pch)
sum+=1; // ,sum +1,
sum = sum * 26 + ch;
i++;
}
return sum;
}