这是一道面试题,今天想着写写。
思路: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()); } }
总想多写点什么,但又觉得自己解释的够清楚的了,说多了显得多余。