高度なPalindromeインタビューの質問


ビデオを見る


コード日1日365日!あなたが何のコーディングの365日を知らないならばcheck this out ! 今日は人気インタビューの質問に取り組むつもりです.これらの解決策は、数字、複数の単語、スペース、句読点のpalindromesです.数字、スペース、句読点のない単純な1語の単語帳の場合はthis post .
解決のビデオhttps://youtu.be/6-rf58ep7lk
免責事項:この問題を解決するために多くの方法がありますこれらは、私が参照したり、コーディングインタビューで使用し、適切な答えとして受け入れるだろういくつかの答えです
TLDR:各分野の底部でのベストソリューションと実際のソリューションの説明

問題


文字列を受け入れる関数を作成し、それがpalindromeの場合に返されます.
例:
      isPalindrome('Red rum, sir, is murder') //true
      isPalindrome('No lemon, no melon') //true
      isPalindrome('Eva, can I see bees in a cave?') //true
      isPalindrome('My dogs are adorable') //false
      isPalindrome('I come in peace!') //false
      isPalindrome("Racecar") //true
      isPalindrome("HelloDevWorld") //false
      isPalindrome("9119") //true
      isPalindrome("12345") //false

Palindromeとは


Palindromeが何であるかをよく知っていることは、少し重要であるかもしれません.palindromeは前方と同じ後方を読む単語、句、またはシーケンスです.文長のpalindromesは、資本化、句読点、および単語の境界を無視します.

解決策


何をする必要がありますか?
  • 何かを受け入れる関数を作成する

  • 可能な解決策は、文字列を反転し、それが受け入れられた文字列に等しいかどうかを確認することです

  • 渡された引数が文字列かどうかを調べる

  • それが
  • 小文字にする
  • 特殊文字と空白を塗りつぶす
  • 逆にする
  • 小文字で入力された文字列に対してチェックし、特殊文字と空白文字が取り除かれます

  • ないなら
  • 文字列にする
  • 逆にする
  • 渡された入力に対しても文字列に変換されたかどうかを調べます

  • 可能な解決策は、各インデックスの最初と最後の文字をチェックし、彼らが同じであるかどうかを確認してください

  • 渡された引数が文字列かどうかを調べる

  • それが
  • 小文字にする
  • 特殊文字と空白を取り除く
  • 文字列の各インデックスについて

  • 文字列の末尾の同じ場所の文字に対してその文字をチェックする
  • 最初と最後の文字
  • 2番目と2番目の最後の文字
  • を返します.
  • ループが終了するとTRUE
  • 偽の値を返します
  • 解決1 -読みやすさ


    まず、何かを受け入れる関数を作成する必要があります
    function isPalindrome(input) {
        //check if the argument that was passed is a string
    
        //if it is 
            //make it lowercase
            //strip out special characters and spaces
            //reverse it
            //check it against the passed input that is lowercase and is stripped of special characters and spaces
        //if not
            //make it into a string 
            //reverse it
            //check it against passed input that also converted to a string
    }
    
    渡された引数が文字列かどうかチェックする必要があります.あなたがtypeofについて知らないならば、参照this MDN page
    function isPalindrome(input) {
        if(typeof(input) === 'string') {
    
        //if it is 
            //make it lowercase
            //strip out special characters and spaces
            //reverse it
            //check it against the passed input that is lowercase and is stripped of special characters and spaces
        } else {
        //if not
            //make it into a string 
            //reverse it
            //check it against passed input that also converted to a string
        }
    }
    
    今では文字列を操作して小文字を作り、句読点を取り除き、スペースを取り除きます.もし私たちがテストケースの1つのような文字列の中で文字化された文字を送るなら、それは問題ではありません.palindromeの定義は、私たちが資本化、句読点、および単語境界を無視すると言うので、我々はスペースと句読点を広げます.あなたが知らないならば.toLowerCase() , .replace() , or regex さらに行く前にそれらの各リンクページをチェックしてください.
    function isPalindrome(input) {
        if(typeof(input) === 'string') {
            input = input.toLowerCase().replace(/[^\w]|_/g, '');
            //reverse it
            //check it against the passed input that is lowercase and is stripped of special characters and spaces
        } else {
        //if not
            //make it into a string 
            //reverse it
            //check it against passed input that also converted to a string
        }
    }
    
    それから、その新しいストリングを逆にする必要があります.あなたが何を知らないならば.split() , .join() , or .reverse() さらに進む前に、それぞれのW 3 Schoolページをチェックしてください.
    function isPalindrome(input) {
        if(typeof(input) === 'string') {
            input = input.toLowerCase().replace(/[^\w]|_/g, '');
            input.split('').reverse().join('');
            //check it against the passed input that is lowercase and is stripped of special characters and spaces
        } else {
        //if not
            //make it into a string 
            //reverse it
            //check it against passed input that also converted to a string
        }
    }
    
    今、我々はちょうど渡された入力に対してそれをチェックする必要があります
    function isPalindrome(input) {
        if(typeof(input) === 'string') {
            input = input.toLowerCase().replace(/[^\w]|_/g, '');
            input.split('').reverse().join('');
            return input === input.split('').reverse().join('');
        } else {
        //if not
            //make it into a string 
            //reverse it
            //check it against passed input that also converted to a string
        }
    }
    
    それがストリングでないならば、それは非常により単純です.我々は同じことをします、しかし、我々がsanitizeする何もない時から、我々はストリングを消毒する必要はありません.それで、我々がそれをする必要があるすべては、それをストリングにして、以前と同じことをして、それを逆にして、前に通過された入力に対してそれをチェックします.
    function isPalindrome(input) {
      if(typeof(input) === 'string') {
        input = input.toLowerCase().replace(/[^\w]|_/g, '');
        return input === input.split('').reverse().join('');
      } else {
        return input.toString() === input.toString().split('').reverse().join('');
      }
    }
    
    あなたが「これをきれいにしてください」(いくらかがこれを読むのが難しいとわかるかもしれない)をするならば、あなたがそれが何であるかについてわからないならば、あなたがternariesでこれをすることができる少しより短くして、少しより短くしてくださいthis MDN page
    function isPalindrome(input) {
      return (typeof(input) === 'string') ?
        input.toLowerCase().replace(/[^\w]|_/g, '') === input.toLowerCase().replace(/[^\w]|_/g, '').split('').reverse().join('') 
      : input.toString() === input.toString().split('').reverse().join('')
    }
    

    ソリューション2 -パフォーマンス


    今、もう少し複雑になって、解決策を考え出す第2の可能な方法の解決策を解決して、各インデックスの最初と最後の文字をチェックして、それらが同じであるかどうかを確認します
    これは私たちが中間文字まで比較しているだけであり、文字列が小文字以外の操作されていないので、これは最もパフォーマンスになります.配列全体を別の配列と比較するのではなく、それが同じではないとしても(それが最初の文字で潜在的に)falseを返すので、それは速く失敗します.
    初めは、何かを受け入れる関数を作成するのと同じです
    function isPalindrome(input){
        //if it is 
            //make it lowercase
            //strip out special characters and spaces
        //for each index of the string up until the middle character
            //check that character against the character in the same spot at the end of the string
        //if they are the same different return false and continue the loop
        //if the loop finishes return true
    }
    
    まず、渡された値が文字列であるかどうかをチェックする必要があります.この解決策を省略した場合(解決策1と同じ説明)、テストケースの1つのような文字列の中で、文字列内の大文字で送信した場合には問題ではありません.palindromeの定義は、私たちが資本化、句読点、および単語境界を無視すると言うので、我々はスペースと句読点を広げます.あなたが知らないならば.toLowerCase() , .replace() , or regex さらに行く前にそれらの各リンクページをチェックしてください.文字列でない場合、文字列を作成する必要があるので、charat ()を解析することができます
    
    function isPalindrome(input){
      input = (typeof(input) === "string") ? input.toLowerCase().replace(/[^\w]|_/g, '') : input.toString()
        //for each index of the string up until the middle character
            //check that character against the character in the same spot at the end of the string
        //if they are the same different return false and continue the loop
        //if the loop finishes return true
    }
    
    このループでは、文字列の真ん中の文字までループする必要があります.文字列の真ん中ではなく、文字列全体の文字を比較しているので、全体の文字列を先頭から最後まで比較します.あなたが知らないならばMath.floor() , for loops , or .charAt() さらに進む前に、それぞれのW 3スクールページをチェックしてください.
    私たちは数学を使います.float ()は、中間文字のインデックスを停止するために、ループをループを通じて文字列を通して取得し、charat ()を使用して各インデックスの文字をチェックします
    まず、文字を通して中文字までループする必要があります
    function isPalindrome(input){
      input = (typeof(input) === "string") ? input.toLowerCase().replace(/[^\w]|_/g, '') : input.toString()
      for(let i = 0; i < Math.floor(input.length/2); i++){
          //check that character against the character in the same spot at the end of the string
          //if they are the same different return false and continue the loop
        //if the loop finishes return true
      }
    }
    
    今、インデックスと逆のインデックスで文字をチェックする必要があります.それらが異なるならば、falseを返してください、そして、それらが同じであるならば、ループで続けてください.
    彼らが同じであるならば、我々がチェックしなければならないので、彼らが等しいということをチェックして、trueを返すならば、それはループを完了しません、そして、あなたは偽陽性を得ます.これが失敗した場合はループを壊し、ループが完了した後にループを終了してfalseを返すと、ループが完了した後であることを確認します.
    function isPalindrome(input){
      input = (typeof(input) === "string") ? input.toLowerCase().replace(/[^\w]|_/g, '') : input.toString()
      for(let i = 0; i < Math.floor(input.length/2); i++){
        if(input.charAt(i) !== input.charAt(input.length-i-1)) return false
      }
      //if the loop finishes return true
    }  
    
    ループが終了した場合、我々は彼らがすべて同じであることを知っているし、我々は真を返すことができます.
    function isPalindrome(input){
      input = (typeof(input) === "string") ? input.toLowerCase().replace(/[^\w]|_/g, '') : input.toString()
      for(let i = 0; i < Math.floor(input.length/2); i++){
        if(input.charAt(i) !== input.charAt(input.length-i-1)) return false
      }
      return true
    }  
    

    結論


    それで、どれが最高ですか?私は、両方の答えがちょうど良いと思います.私はジュニア開発者が解決策2に来ることを期待しないだろう.彼らがそれをしたならば、なぜそれがより多くのパフォーマーであるかについて説明することができたならば、私は非常に感動します.私がそれを書くことになっているならば、私は解決1を書くでしょう、このような小さい処理力を取る機能に関して、特にパフォーマンスの上で読みやすさを好むので.しかし、もし彼らが大きなpalindromeをしている場合は、最も効率的な方法を求められていたソリューション2はあなたの最善の賭けになる.ここで興味があったのは、Jsbenchによって実行される両方のソリューションのメトリクスです.実行されたテストは、例の一覧です.

    あなたがコメントセクションで思い付いた解決策を残してください.あなたはまた、あなたはそれが来るを参照してください可能性があります以下のコメントでそれを残すことを参照してくださいする必要があります任意の課題がある場合!