从一道不能用循环的问题开始

标签: web JavaScript python


https://www.zhihu.com/question/41493194
这里说明一下,这题我早就见过很相似的题目,不用循环,创建一个长度为500,每个元素都为m的数组。
当时,我就确定了两个思路,一个是使用递归(至今都不会),一个是使用map。做法:

1
Array(100).map(e=>"m")

结果,当然是出错了,数组是(100) [empty × 100],这样的数组每个元素是undefined,是不能改变的。这样的数组叫稀释数组!直到今天,我在GitHub上看到这样的代码。

1
2
3
4
5
6
7
const chunk = (arr, size) =>
Array.from({ length: Math.ceil(arr.length / size) }, (v, i) =>
arr.slice(i * size, i * size + size)
);

//[ [ 1, 2 ], [ 3, 4 ], [ 5 ] ]
console.log(chunk([1, 2, 3, 4, 5], 2));

一开始我就懵了,这是闹哪样啊?我可没见过这样的es6语法啊,后在MDN上看Array.from的准确用法看到这样的例子。

1
2
Array.from({length: 5}, (v, i) => i);
// [0, 1, 2, 3, 4]

灵机一动,这不就是我积压已久问题的答案吗?

1
Array.from({length: 500}, (v) => "m");

后来进行搜索到了知乎(逼乎),看到上面的链接,才知道上面是神仙打架。比较相似和简洁的答案

1
2
3
4
5
6
7
Array.from(Array(100).keys())


or


[...Array(100).keys()]

递归写法:

1
2
3
4
5
6
7
8
9
10
11
function reduce(prev, curr) {
if (curr >= 100) {
return prev
}
prev.push(curr)
return reduce(prev, curr + 1)
}

var arr = reduce([], 0)

console.log(arr);

也有写一大串字符串,再用.split(‘’)组成数组(密集数组),再替换的(不推荐不简洁)

1
2
3
'1'.repeat(100).split('').map((e,i)=>e=i);

Array(100).fill(0).map((item,index)=>index);

很搞事的idea
1<<24,也就是1向左移24位,也就是2的24次方,一共有25位,每个数组匹配4个1111,这样就有长度为100的字符串。

1
(1<<24).toString(2).replace(/\d/g,'1111').split('').map((e,i)=>e=i);

贴个python的来捣乱

1
print range(1,101)

还有很多方法,我还没有去研究,不过现在还是去看GitHub吧,远离逼乎!