zoukankan      html  css  js  c++  java
  • 算法题:用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

  • 相关阅读:
    xmind等工具下载
    remix使用经验积累
    visual studio code下载地址
    以太坊存储类型(memory,storage)及变量存储详解
    remix共享本地文件夹教程
    在remix恢复已部署的合约步骤
    ERC721 相关语法和知识点学习
    用truffle写测试用例
    truffle环境搭建和应用
    jenkins pipeline基础语法与示例
  • 原文地址:https://www.cnblogs.com/lost0/p/1765298.html
Copyright © 2011-2022 走看看