我正在做一个代码战争挑战,找不到解决方案,但我真的想知道我们如何解决这个问题。
因此,我们得到两个整数,假设 N 和 D,我们应该返回一个包含恰好 N 个字母“n”和恰好 D 个字母 d 的字符串,并且没有三个连续字母相同。
例如,如果我们得到 N=5 和 D=3,我们应该返回“nndnndnd”或“nbnnbbnn”或任何其他正确答案
另一个例子,如果我们得到 N=1 D=4 唯一接受的答案应该是“ddndd”
我所做的是创建一个像这样的辅助函数:
function generateArray (char,q){
let arr= []
for(let i=0; i<q; i++){
arr.push(char)
}
return arr
}
在主函数内部:
function solution(N, D) {
let arrayOfchar = generateArray('n',N)
arrayOfchar.reduce((prev,current,index) => {
for(let i=0; i<D; i++) {
if(prev===current) {
arrayOfchar.splice(index, 0, "d")
}
}
})
}
但我不知道如何将“d”仅放在两个或更少的连续“n”之后
有人知道吗?
我认为,与其从一开始就创建同一字符的整个数组,不如逐块创建数组,直到 N 和 D 为 0 为止更有意义。
这是一种可能的实现。总体思路是尝试推入较大的字符数,或者如果由于连续 3 个字符而无法推入,则推入另一个字符,然后将相应的字符数减去 1。重复直到两个计数都为 0:
function solution(n, d) {
const arr = [];
function canPush(char) {
const { length } = arr;
return (arr[length - 1] !== char || arr[length - 2] !== char);
}
function push(char) {
arr.push(char);
if (char === 'n') n--;
else if (char === 'd') d--;
}
while (n > 0 || d > 0) {
if (n > d) {
if (canPush('n')) push('n');
else if (d === 0) return console.log('Impossible');
else push('d');
} else if (d >= n) {
if (canPush('d')) push('d');
else if (n === 0) return console.log('Impossible');
else push('n');
}
}
console.log(JSON.stringify(arr));
// return arr;
}
solution(5, 3);
solution(1, 4);
solution(1, 5);
solution(5, 1);
solution(2, 5);
solution(2, 6);
solution(2, 7);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)