Javascript |基于连续字母条件的动态字符数组

Javascript |基于连续字母条件的动态字符数组,javascript,arrays,loops,object,Javascript,Arrays,Loops,Object,我在做一个codewar挑战赛,找不到解决方案,但我真的想知道我们如何解决这个问题 我们得到两个整数,比如N和D,我们应该返回一个字符串,其中包含N个字母'N'和精确的D个字母D,没有三个连续的字母是相同的 例如,如果我们得到N=5和D=3,我们应该返回“nndnndnd”或“nbnnbbnn”或任何其他正确答案 另一个例子是,如果我们得到N=1 D=4,唯一被接受的答案应该是“ddndd” 我所做的是制作一个助手函数,如下所示: function generateArray (char,q){

我在做一个codewar挑战赛,找不到解决方案,但我真的想知道我们如何解决这个问题

我们得到两个整数,比如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
}
函数GeneratorRay(char,q){
设arr=[]
for(设i=0;i{

对于(设i=0;i而不是一开始就创建相同字符的整个数组,我认为逐段创建数组更有意义,直到N和D变成0

下面是一个可能的实现。总体思路是尝试推送较大的字符计数,或者如果由于一行3个字符而无法推送,则推送另一个字符,并将相应的字符计数减去1。重复此操作,直到两个计数都为0:

函数解(n,d){
常数arr=[];
函数canPush(char){
常数{length}=arr;
返回(arr[length-1]!==char | | arr[length-2]!==char);
}
功能推送(字符){
arr.push(字符);
如果(char=='n')n--;
如果(char=='d')d--;
}
而(n>0 | | d>0){
如果(n>d){
if(canPush('n'))push('n');
如果(d==0)返回console.log(“不可能”);
else-push('d');
}如果(d>=n),则为else{
if(canPush('d'))push('d');
如果(n==0)返回console.log(“不可能”);
else-push('n');
}
}
log(JSON.stringify(arr));
//返回arr;
}
溶液(5,3);
溶液(1,4);
溶液(1,5);
溶液(5,1);
溶液(2,5);
溶液(2,6);

解决方案(2,7)这是另一个解决这个有趣问题的方法。这个方法不是一个接一个的,而是找出哪个是较大的数字,然后对该字母进行数组,同时对较小的字母进行简单的数组,然后将它们一个接一个…所以你有5和3…nn+d+nn+d+n。2对大的加一个小的等等

constfillarray=(长度、字母、bigNumber)=>{
var arr=[]
对于(var索引=0;索引<长度;索引++){
arr.push([字母,bigNumber%2&&index+1==长度?null:字母])
}
返回arr;
}
常量getString=(n,d)=>{
var swtch=d>n,arr=[],
biger={number:swtch?d:n,字母:swtch?'d':'n',ceil:Math.ceil((swtch?d:n)/2)},
较小的={number:swtch?n:d,字母:swtch?'n':'d',ceil:Math.ceil((swtch?n:d)/2)}
如果(数学绝对值((较大的数字/2)-较小的数字>=1.5)){
返回“对于给定参数不可能!”
}
var bigWorkArray=fillArray(biger.ceil,biger.letter,biger.number)
var smallWorkArray=n==d?fillArray(较小的.ceil,较小的.letter,较小的.number):数组(较小的.number).fill(较小的.letter)
对于(var i=0;i
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")
        }
    }
    })
}