快速查找Excel中n对应的列算法

这是一道面试题,今天想着写写。

思路:1,了解需求,

           2,根据需求总结,提炼其中的规律,最好能公式化。

           3,根据自己的会的编程语言,通过合理的方式实现公式。

           4,验证。

代码如下:

package com.Test;


import java.util.ArrayList;
import java.util.List;
/*
* 计算公式: N = a*26^(n) + b*26^(n-1) + c*26^(n-2) + ... + k*26^(0)
* 可以将公式转化成26进制运算
* */
public class Excel {
    public static void main(String[] args) {
        for(int n = 0; n < 457003; n++){
            low(n);
        }
    }
    //利用递归的思想,进行十进制转二十六进制
    public static void SysConvert(int n,List<Integer> ysList){
        int shang = n / 26;
        int yushu = n % 26;
        ysList.add(yushu);
        if(shang > 0){
            n = shang;
            SysConvert(n,ysList);
        }
    }
    //根据二十六进制计算所在列
    public static void low(int n){
        StringBuffer sb = new StringBuffer();
        List<Integer> ysList = new ArrayList<>();
        String[] word = { "Z","A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y"};
        String[] word1 = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y","Z"};
        SysConvert(n,ysList);
        boolean b = true;
        //Z - 25
        //ZA - 1,0,0 ~ ZZ - 1,0,25
        //ZZA - 1,0,0,0 ~ ZZZ - 1,0,0,25
        if(ysList.size() > 2){
            for(int i = 1; i < ysList.size()-1; i++){
                if(ysList.get(i) != 0){
                    b = false;
                }
            }
        }
        else{
            b = false;
        }
        if(b && ysList.get(ysList.size()-1) == 1){
            ysList.remove(ysList.size()-1);
        }
        for(int i = ysList.size()-1; i >= 0; i--){
            if(i == 0){
                sb.append(word1[ysList.get(i)]);
            }
            else{
                //A - 0
                //AA - 1,0
                //AAA - 1,1,0
                //AAAA - 1,0,1,0
                if(i > 1 && ysList.get(i) == 0 && ysList.get(1) == 1){
                    sb.append(word1[ysList.get(i)]);
                }
                else{
                    sb.append(word[ysList.get(i)]);
                }
            }
        }
        System.out.println("索引:"+n+"   所得列:"+sb.toString());
    }
}

总想多写点什么,但又觉得自己解释的够清楚的了,说多了显得多余。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值