[算法] - 多维数组的元素拼接

前两天被朋友问道的一道算法题,今天把答案贴出来。当然会有一些疏漏的地方,欢迎指正。

问题描述:

二维数组:

[
[1,2,3],
[a,b,c]
]

==> [1a,1b,1c,2a,2b,2c,3a,3b,3c]

求三维如何计算出来?

[
[1,2,3],
[a,b,c],
[A,B,C]
]

第一眼看到这个我以为只需要三个for循环就行了,too young too simple.

后来回到家里,仔细看了下(码代码之前),我又天真的以为是一个递归。

当我开始着手写的时候,才发现自己想错了。

而正确的思路应该是,把这个复杂的问题先简单化。既然二维的数组利用两个for循环就很容易处理的,那就把三维的拆成二维的,先解决前连个数组就行了,然后把得到的结果和剩下的那个数组再组成一个新的二维数组,用同样的方法去处理。 哎呦呦~~,是不是很简单? ^_^

那就开始码代码了…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function connactArrays (arr) {
var isArray = Array.isArray(arr),
sub = 2,
len,
res;
// 不是数组,直接返回错误信息。当然也可以打印出错误信息,并返回一个空的数组。
if (!isArray) {
return 'error type';
}
len = arr.length;
// 长度为1,直接返回
if (len == 1) {
return arr;
}
res = connactTwoArr(arr[0], arr[1]);
while (len > sub) {
res = connactTwoArr(res, arr[sub])
sub++;
}
return res;
}
function connactTwoArr (arr1, arr2) {
var arr = [],
len1 = arr1.length,
len2 = arr2.length,
i,
j,
arr = [];
if (!len1) {
return arr2;
}
if (!len2) {
return arr1;
}
for(i = 0; i < len1; i++){
for (j = 0; j < len2; j++) {
arr.push(arr1[i] + arr2[j].toString()) // 这里防止两个数组均为数字时,按数字的相加处理
}
}
return arr;
}

其中加了一些简单的判断。

1
2
3
4
5
测试:
connactArrays([[1,2,3],['a','b','c'],['A','B','C']]);
// output
["1aA", "1aB", "1aC", "1bA", "1bB", "1bC", "1cA", "1cB", "1cC", "2aA", "2aB", "2aC", "2bA", "2bB", "2bC", "2cA", "2cB", "2cC", "3aA", "3aB", "3aC", "3bA", "3bB", "3bC", "3cA", "3cB", "3cC"]