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

  • 相关阅读:
    chrome Network 过滤和高级过滤
    python3 在webelement对象里面获取元素路径的方法
    Robot frawork关键字使用报错原因
    robotframework-autoitlibrary离线安装
    网络基础之网络协议篇
    eclipse查看jar包源代码
    对链接服务器进行查询
    数据库还原失败System.Data.SqlClient.SqlError: 无法执行 BACKUP LOG,因为当前没有数据库备份
    sqlserver创建链接服务器
    5.0jemter(英文版)录制脚本,进行压力测试
  • 原文地址:https://www.cnblogs.com/lost0/p/1765298.html
Copyright © 2020-2023  润新知