题解 | #双色球机选一注#
双色球机选一注
https://www.nowcoder.com/practice/4d712994d0364a159f8169b7b0e74d04
function randomFn() {
//返回生成
function create(max, cnt) {//生成随机数的最大值,生成数字的个数,以数组形式返回
let arr = new Array(max).fill(0).map((_, idx) => (idx + 1) < 10 ? `0${idx + 1}` : `${idx + 1}`);
let ans = [];
for (let i = 0; i < cnt; i++) {
let idx = Math.floor(Math.random() * max);//0-32
ans.push(arr[idx]);
arr.splice(idx, 1);
max -= 1;
}
ans.sort();//排序
return [ans, arr];
}
let red = create(33, 6);
let blue = create(16, 1);
let res = red[0].join(',') + '|' + blue[0][0];
//效果实现,请使用原生JavaScript操作DOM元素,不要增加、删除DOM元素或修改css
let rwrap = document.getElementsByClassName('red')[0].children[1].children;
let bwrap = document.getElementsByClassName('blue')[0].children[1].children;
function changePlace(k, arrayLike, target, rest) {//需要替换的数字个数、节点类数组、剩余数字的数组
let idx = 0;
while (idx < k) {
arrayLike[idx].classList.add('active');
arrayLike[idx].innerHTML = target[0][idx];
idx++;
}
for (let i = idx, j = 0; i < arrayLike.length; i++, j++) {
arrayLike[i].innerHTML = rest[j];
}
}
changePlace(6, rwrap, red, red[1]);
changePlace(1, bwrap, blue, blue[1]);
return res;
}
关键在于不添加或者删除节点,测试用例应该会测试引用是否变化,所以只能替换掉innerHTML。另外代码也出错过一次,可能有些没预料的错误。

