Loading

算法题:用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

posted @ 2010-06-25 16:27  码农加一  阅读(1291)  评论(0编辑  收藏  举报