记录一次华为招聘的编程题-excel中的26进制
上次做华为的机试,碰到了与excel有关的题目。
大概复述一遍:excel中的列数使用26个字母组合表示:
a b c ... y z aa ab ac ... az ba bb bc ... by bz ... ... zy zz aaa aab ......
1 2 3 ... 25 26 27 28 29 ... 52 53 54 55 ... 77 78 ... ... 701 702 703 704 ......
试编写一个算法,输入列数,输出对应的字母组合。例如:输入53,输出ba。
当时机试时没有做出来,第二天早上才做出来的,这里记录一下。
JavaScript写的,其他语言类比。
var line = "abcdefghijklmnopqrstuvwxyz"; var list = line.split(""); function baseConversion(N) { var jz = []; //获得有0的26进制 while (true) { if (parseInt(N/26) === 0) { jz.push(N%26); break; } else{ jz.push(N%26); N = parseInt(N/26); } } //转化成无0的26进制 var jzn = []; ifCarry = false; for (var i = 0; i < jz.length; i++) { if (ifCarry) { if (jz[i] > 1) { ifCarry = false; jzn.push(jz[i] - 1); } else{ if (jz[i] === 0) { ifCarry = true; jzn.push(25); } if (jz[i] === 1) { if (i === jz.length - 1) { } else{ ifCarry = true; jzn.push(26); } } } } else{ if (jz[i] === 0) { ifCarry = true; jzn.push(26); } else{ ifCarry = false; jzn.push(jz[i]); } } } //构建输出 var out = ""; for (var i = 0; i < jzn.length; i++) { out = list[jzn[i] - 1] + out; } return out; } var outs = []; for (var i = 1; i < 1000; i++) { outs.push(baseConversion(i)); } console.log(outs.join(" "));