0

私は文字列を言います

((C1 AND C2) OR C3 AND C4) 

ここで、入力が「2」の場合、C2とORである次の演算子を削除し、番号を再配置することになっています...したがって、出力は

((C1 AND ) C2 AND C3).

**テスト文字列の入力と出力

----------STRING --------------------------- INPUT ---------------EXPECTED OUTPUT

1. (C1 AND C2 OR C3 AND C4)                <<3(Input)>>          (C1 AND C2 OR C3)

2.  C1 OR C2 AND (C3 OR C4) AND C5         <<2(Input)>>          C1 OR (C2 OR C3) AND C4

したがって、指定された入力番号で「C」を削除し、存在する場合は次の演算子を削除し、すべての角かっこを保持して、昇順の番号で「C」を削除する必要があります。これはJS関数で実行する必要があります

4

1 に答える 1

2

入力が一貫している限り、これらの線に沿った何かがおそらくあなたのニーズに合うでしょう。「すべての角かっこを保持する」とおっしゃっていたのは知っていますが、出力が醜くなるので、代わりにかっこを修正することにしました。その部分は簡単に取り出せます。

function handleInput(str, input){
  var inArray = str.split(' ');
  inArray.forEach(function(v,i,a){
    if(v.indexOf("C"+input) > -1){
      if(v.indexOf('(') > -1 || v.indexOf(')') > -1)
        inArray = fixParen(inArray, input, v, i);
      else if(i+2 < a.length){
        inArray.splice(i,2);
        inArray = fixNumbers(inArray);
      }
      else
        inArray.splice(i-1,2);
      console.log(inArray.join(' '));
    }
  });
}
function fixParen(inArray, input, elem, index){
  var elemArray = elem.split('');
  var parenNumber = 0;
  if(elem.indexOf('(') > -1){
    elemArray.forEach(function(v){
      if(v == '('){
        parenNumber++;
      }
    });
    for (var i = index+2; parenNumber > 0; i+=2){
      var tempElem = inArray[i].split('');
      var n = tempElem.indexOf(')');
      if(n > -1){
        tempElem.splice(n,1);
        inArray[i] = tempElem.join('');
        parenNumber--;
      }
    }
    inArray.splice(index,2);
    return fixNumbers(inArray);
  }
  else{
    elemArray.forEach(function(v){
      if(v == ')'){
        parenNumber++;
      }
    });
    for (var i = index-2; parenNumber > 0; i-=2){
      var tempElem = inArray[i].split('');
      var n = tempElem.indexOf('(');
      if(n > -1){
        tempElem.splice(n,1);
        inArray[i] = tempElem.join('');
        parenNumber--;
      }
    }
    inArray.splice(index,2);
    return fixNumbers(inArray);
  }
}
function fixNumbers(inArray){
  var count = 1;
  inArray.forEach(function(v,i,a){
    if(v.indexOf('C') > -1){
      var tempElem = v.split('');
      var n = tempElem.indexOf('C');
      tempElem.forEach(function(val,ind,arr){
        if(parseInt(val,10))
          tempElem.splice(ind,1);
      });
      tempElem.splice(n+1,0,count);
      inArray[i] = tempElem.join('');
      count ++;
    }
  });
  return inArray;
}

これは実際、見た目よりもはるかに単純な問題です。まず、文字列のすべての重要な部分が''で均等に区切られていることに注意してください。これにより.split(' ')、すべての便利なパーツの素晴らしい配列を提供するために使用できます。次に、括弧は、C必要なロジックの量を削減する要素にのみ付けることができます。次に、すべて(に対応)するある時点があり、括弧が一致する要素があると想定できるため、文字列の長さのテストを完全に無視できます。最後に、2つのケースしかありません。これは最後のC要素であるため、直前に演算子を削除するか、最後ではなく、後に演算子を削除します。括弧はさておき、このためのロジックはかなり短いです。

于 2013-03-24T07:34:30.157 に答える