代码之家  ›  专栏  ›  技术社区  ›  Emad Dehnavi

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

  •  2
  • Emad Dehnavi  · 技术社区  · 7 年前

    所以我们得到两个整数,比如N和D,我们应该返回一个字符串,它正好包含N个字母'N'和精确的D个字母,并且没有三个连续的字母是相同的。

    另一个例子是,如果我们得到N=1d=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”之后

    有线索吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   CertainPerformance    7 年前

    与其一开始就创建一个相同字符的完整数组,我认为逐段创建数组会更有意义,直到N和D变成0。

    这里有一个可能的实现。一般的想法是尝试推送任何一个字符数较大的字符,或者如果由于一行三个字符而无法推送,则推送另一个字符,并将适当的字符数减去一。重复直到两个计数都为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);
        2
  •  0
  •   Akrion    7 年前

    这是解决这个有趣问题的另一个办法。这个想法不是一个接一个的,而是找出哪个是较大的数字,然后做一个字母对的数组,同时做一个较小的简单数组,然后把它们一个一个地连接起来。。。所以你有5和3。。。 n n+d+nn+d+n . 两对大的加上一对小的等等。

    const fillArray = (length, letter, bigNumber) => {
       var arr = []
       for(var index=0; index < length; index++) {
          arr.push([letter, bigNumber%2 && index+1 === length ? null : letter])
       }
       return arr;
    }
    const getString = (n, d) => {
      var swtch = d > n, arr = [],
       bigger = {number: swtch ? d : n, letter: swtch ? 'd' : 'n', ceil: Math.ceil((swtch ? d : n)/2)},
       smaller = {number: swtch ? n : d, letter: swtch ? 'n' : 'd', ceil: Math.ceil((swtch ? n : d)/2)}
    
       if(Math.abs((bigger.number/2) - smaller.number >= 1.5)) {
         return 'Not possible with given parameters!'
       }
    
       var bigWorkArray = fillArray(bigger.ceil, bigger.letter, bigger.number)
       var smallWorkArray = n === d ? fillArray(smaller.ceil, smaller.letter, smaller.number) : Array(smaller.number).fill(smaller.letter)
    
       for(var i=0; i < bigWorkArray.length; i++) {
         arr.push(...bigWorkArray[i],...smallWorkArray[i] || '')
       }	
       return arr.join('');
    }
    
    console.log(getString(5,3))
    console.log(getString(1,4))
    console.log(getString(1,5))
    console.log(getString(5,1))
    console.log(getString(2,5))
    console.log(getString(2,6))
    console.log(getString(2,7))