【发布时间】:2019-11-02 17:28:25
【问题描述】:
我得到一个输入 = 5。
我想将此数组中的 5 个随机对象的 is_winner 键设置为 true。
const participants = [
{code: '111111', is_winner: false},
{code: '222222', is_winner: false},
{code: '444444', is_winner: false},
{code: '777777', is_winner: false},
{code: '555555', is_winner: false},
{code: '666666', is_winner: false},
{code: '333333', is_winner: false},
{code: '888888', is_winner: false},
{code: '999999', is_winner: false},
];
第一次随机化:
const participants = [
{code: '111111', is_winner: false},
{code: '222222', is_winner: true},
{code: '444444', is_winner: false},
{code: '777777', is_winner: true},
{code: '555555', is_winner: false},
{code: '666666', is_winner: true},
{code: '333333', is_winner: true},
{code: '888888', is_winner: false},
{code: '999999', is_winner: true},
];
我尝试了以下有 2 个 for 循环,其中一个是 O(n^2)
const winners = [];
while (winners.length < 5) {
const randomParticipant = participants[Math.floor(Math.random() * participants.length)];
if (!winners.includes(randomParticipant.code)) {
winners.push(randomParticipant.code);
}
}
for (let participant of participants) {
if (winners.includes(participant.code)) {
participant.is_winner = true;
}
}
看看有没有更高效的方法。
【问题讨论】:
-
看起来像家庭作业。不久前,他发布了一个类似的问题。 SOF 不是作业解决工具
-
@mwilson 我在问题中发布了我的解决方案。我正在努力变得更好,看看那里有什么。感谢您的理解。
-
创建一个从
0到participants.length-1的数字数组。打乱数组,取前 5 个元素,并使用它们作为索引来更改is_winner。 -
winners.includes()是 O(n),所以你的整个算法是 O(n^2)。使用Set而不是数组来解决这个问题。
标签: javascript arrays algorithm object ecmascript-6