算法题:用php生成excel列
题目:
用php生成excel列
型如:
A B C D E …… Z AA AB AC AD………AZ BA BB BC BD………BZ………ZZ AAA AAB …………
比如给一个参数27
返回AA
分析:
本题重点是观察和联想,事实上我总结凡是算法题一般都可以很轻易的写出一种常规算法。但经过观察和联想,或辅以图形分析,都会有意想不到的收获。
本题我的分析思路是,首先在纸上写画这个序列,很快可以想到26这个关键点,然后将序列分组,可以看出每组是按照等比数列展开的。那么通过给出的位置参数,我就能知道这个位置上的值是多少位的,这是我的第一个结论,在我的算法中有提现。
然后看每一位的变化规律,你会发现都是AAA...到ZZZ...的形式,这像什么,像不像000...到999...,是的,这是我的第二个结论,每组序列都是按照值从低到高的顺序排列的,只不过进制是26进制。进而我采用了php的进制函数来做这件事。
进制和实际叫法的关系形如我们把1,2,3叫做一,二,三,这里,我们就是将0,1,2处理成A,B,C。
我的算法:我的算法不是很长,独立的语句我给写到一块了,但是不难理解,主要代码就4行,:)。
view plaincopy to clipboardprint?
<?php
function getExcelValue($index)
{
$index = (int)$index;if ($index <= 0) return; //输入检测
$dimension = ceil(log(25 * $index + 26, 26)) - 1; //算结果一共有几位,实际算的是位数减1,记住是26进制的位数
$n = $index - 26 * (pow(26, $dimension- 1) - 1) / 25; //算结果在所在位数总数中排第几个
$n--; //转化为索引
return str_pad(
str_replace(
array_merge(range(0, 9), range('a', 'p')),
range('A', 'Z'), base_convert($n, 10, 26)
), $dimension, 'A', STR_PAD_LEFT
); //翻译加补齐
}
<?php
function getExcelValue($index)
{
$index = (int)$index;if ($index <= 0) return; //输入检测
$dimension = ceil(log(25 * $index + 26, 26)) - 1; //算结果一共有几位,实际算的是位数减1,记住是26进制的位数
$n = $index - 26 * (pow(26, $dimension- 1) - 1) / 25; //算结果在所在位数总数中排第几个
$n--; //转化为索引
return str_pad(
str_replace(
array_merge(range(0, 9), range('a', 'p')),
range('A', 'Z'), base_convert($n, 10, 26)
), $dimension, 'A', STR_PAD_LEFT
); //翻译加补齐
}
参考算法:原解法是递归的思路,也比较巧妙,但递归方式不太好理解。而且如果批量输出序列需要重新初始化字符串。
$array = range('A', 'Z');
$str = '';
function test($num)
{
global $array, $str;
if ($num >= 26) {
$str = $array[$num%26] . $str;
test(intval($num /= 26) - 1);
} else {
$str = $array[$num] . $str;
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/iminto/archive/2009/08/24/4479158.aspx