【发布时间】:2018-08-09 13:13:49
【问题描述】:
给定一个任意长度的1s 和0s 输入数组,例如:
[0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0]
如果大小为n0s 的块可以放入输入中,我如何(最有效地)计算一个新的数组详细信息?
示例
现在的输出意味着
- 1 == '是的,大小可以放在这里的零块'
- 0 == '无法容纳这样大小的块'
- 块大小 = 1 (
[0]):[1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1] - 块大小 = 2 (
[0,0]):[0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1] - 块大小 = 3 (
[0,0,0]):[0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0] - 块大小 = 4 (
[0,0,0,0]):[0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
我使用的是 ES6,所以任何语言功能都可以。
编辑:
输出不应该只是一个“是”/“否”,一个大小为“n”的块可以放在这个数组中。更具体地说,它需要是一个相同长度的数组,其中一个“1”/“真”数组值代表任一:
- 是的,一个大小为“n”的块可以从这里开始并适合这里,或
- 是的,这个槽可以包含一个大小为“n”的块,在它之前开始
关于第二点,这意味着块大小为 3:
input = [1, 0, 0, 0, 0, 1];
output = [0, 1, 1, 1, 1, 0];
编辑 2:
这是我想出的功能,但似乎效率很低:
const calculateOutput = (input, chunkSize) => {
const output = input.map((value, index) => {
let chunkFitsHere = false;
const start = (index - (chunkSize) >= 0) ? index - (chunkSize) : 0;
const possibleValues = input.slice(start, index + chunkSize);
possibleValues.forEach((pValue, pIndex) => {
let consecutives = 0;
for (let i = 0; i < possibleValues.length - 1; i += 1) {
if (consecutives === chunkSize) {
break;
}
if (possibleValues[i+1] === 0) {
consecutives += 1;
} else {
consecutives = 0;
}
}
if (consecutives === chunkSize) {
chunkFitsHere = true;
}
});
return chunkFitsHere ? 1 : 0;
});
return output;
};
【问题讨论】:
-
请添加块大小如何影响结果。除此之外,请添加你的代码,你试过了。
-
我将澄清上述内容并添加一个我很快尝试过的适当示例 - (必须为问题抽象出我原来的问题)
标签: javascript arrays algorithm ecmascript-6