阿里前端笔试填表单题目解题思路(然而时间不够我并没有提交)
如果今晚阿里能够多给我点时间,给个20-30分钟,我就能把这道题交上去,然而当交卷的时候,这道题我是一片空白,只剩一点时间完全没有时间写了。看来我注定的是和阿里无缘了,唉,说多了都是泪,楼主一个双非本科是真心的累啊!笔试不出点彩根本没机会啊!
以下只是给出一个思路,并不一定是最优解,代码也不一定完全正确,毕竟没有环境跑。
其实这道题目和电话号码的字母组合(http://www.lintcode.com/zh-cn/problem/letter-combinations-of-a-phone-number/)有点像,我们把每一组数据看成是一个数据组,那么假设第 i 组数据有 m 个数据,第 i-1 组数据有 n 个数据,那么 i 和 i-1 可以组成 m*n 个数据组,使用递归法求得公式第 i 组数据与 i+1 组数据可以组成的数据组个数 f(i) = i * f(i+1),那么我们的就可以先通过递归公式求出数据组,然后用数据组去填充表格,如果假设 data[i] 的长度为 d[i] 的话,那么空间复杂度和时间复杂度是一样的 O(d[1] * d[2] * d[3] * ... ... * d[n])。貌似有点大,不过表格的数据必须要填充这么多项。
function fillSheet(sheet, data) { function dataGroups (data) { var groups = []; //递归求解下一个数据组 var nextGroups = dataGroups(data.slice(1, data.length)); //当前数据组 var currentGroups = data[0]; if(nextGroups.length <= 0){ //数据组的边界,当求到 data 末尾时,返回 return currentGroups; }else{ //即若第n行及以下组若有x列,且n-1行有y列,则会生成x·y列的数据组 for (var i = 0; i < currentGroups.length; i++) { for(var j = 0; j < nextGroups.length; j++){ var dataCol = nextGroups[j].unshift(currentGroups[i]); groups.push(dataCol); } } } return groups; } var dataGroups = dataGroups(data); for (var i = 0; i < dataGroups.length; i++) { for(var j = 0; j < dataGroups[i].length; j++){ //注意这里我们数据组的行和列是相反的,dataGroups 中的每一个元素代表一列数据组 sheet.setSheet(j, i, dataGroups[i][j]); } } }
#阿里巴巴##前端工程师#