sharp231
@sharp231

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

与えられた文字列から繰り返し文字のカウントするアルゴリズムを作成したい

Q&A

Closed

解決したいこと

SearchingChallenge(str)で、渡されるstrパラメーターを受け取り、繰り返し文字の数が最も多い最初の単語を返せるようにアルゴリズムを作成したい

例えば 「今日は史上最高の日です!」は 2 つの e (および 2 つの t) を持ち、同じく 2 つの e を持つものより前に来るため、最大の値が返されるはずです。

文字が繰り返される単語がない場合は、-1を返します。単語はスペースで区切られます。

このように作成したいです

Have the function SearchingChallenge(str) take the str parameter being passed and return the first word with the greatest number of repeated letters. For example: "Today, is the greatest day ever!" should return greatest because it has 2 e's (and 2 t's) and it comes before ever which also has 2 e's. If there are no words with repeating letters return -1. Words will be separated by spaces.

発生している問題・エラー

エラーは出ていないです

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

function SearchingChallenge(str) {
  let result = "";
  //正規表現を利用する?文字列で処理する
  let wordsList = str.split(" ");

  //同じ文字が何度繰り返されるか数える処理を作るsplit関数?
  for (let i = 0; i < wordsList.length; i++) {
    const words = wordsList[i];
    //if文で文字列の最大値を出すための処理が必要
    //連想配列、文字列のkeyを指定して値を取得する
    if (result[i] > words) {
      console.log(result[wordsList.length - 1]);
    }

  }
  // code goes here

  //言葉なしの場合の処理を作る。文字列から数字に変換
  return str;

}

// keep this function call here 
console.log(SearchingChallenge(readline()));

自分で試したこと

文字列を処理するので正規表現を必要なのか?
同じ文字が何度も繰り返されるか数える
例えばToday, is the greatest day ever!
の単語から1つの単語greatestを出力するためにsplit関数が必要?なのか調べています

ifで文字列の最大値を出すための処理を作成しているがわからなくなったのでアドバイスをお願いします

0

5Answer

文字列から繰り返し文字のカウントする

繰り返し文字数が最大である単語を見つけてその単語を返す

いろいろ解釈できるので、期待値がちょっと理解できません。

例えば、「こういう文字列ならいくつ(なに)です」を、何パターンか挙げてもらうことできますか。

0Like

Comments

  1. @sharp231

    Questioner

    改善しました

  2. 例えば 「今日は史上最高の日です!」は 2 つの e (および 2 つの t) を持ち、同じく 2 つの e を持つものより前に来るため、最大の値が返されるはずです。

    更に分からなくなりました。

  3. @sharp231

    Questioner

    ありがとうございます
    原文を追加しました
    みていただけると幸いです

  4. ネット上に答えがありました。
    ちゃんと期待通りの答えがえられました。

    追伸;

    "This is a pen." だと、誤った答えとなったので、完璧なコードではないようです。
    (正規表現の使い方に問題がありそう)

  5. @sharp231

    Questioner

    ありがとうございます

処置はサーバー側で Node.js でやるのか、クライアント側でブラウザで動く JavaScript でやるのかどっちですか? 後者なら Node.js のタグは削除してください。前者なら開発環境(OS, IDE など)を書いてください。

文字列を処理するので正規表現を利用してします

質問者さんのコードでは正規表現は使ってません。用語は正確にお願いします。文章でやり取りするここのようなサイトでは話が通じなくなりますので。

繰り返し文字数が最大である単語を見つけて

対象とするのは何ですか? "Today, is the greatest day ever!" という文字列が例として挙げられてますが、それにあるように英文かつ ASCII 文字だけで良いのですか? そして、この例ではどのように「繰り返し文字数が最大」を判定するのですか? 例えば "... ever!!!" とかなっていたらどうするのですか?

0Like

Comments

  1. 日本語が母国語ではない、もしくは日本語の文章を書くのが苦手な人ですか? 話が通じてないです。

    質問者さんの前のスレッドでも書きましたが、自分の質問を文書化することができないのでは、ここのような文章でやり取りする Q&A サイトでは日本語レベルで話が通じなくて問題解決は無理だと思います。

    Face-to-face で講師・先生などと話ができて、何が分からないかまで会話の中から探ってもらえて、回答がもらえる学校のような環境を探すことをお勧めします。

  2. @sharp231

    Questioner

    では、記述を@SurferOnWwwさまが記述していただけるんですか?
    よろしくお願いします

    ありがとうございます

    それでは失礼します

文字数が最大である単語を見つけてその単語を返すこと

意味が分かった
多分こういう事?

const wordLengthMap = "Today, is the greatest day ever!".split(" ").map(x => x.toLocaleLowerCase()).reduce((memo, x) => {
  memo.set(x, x.length)
  return memo
}, new Map())

const maxLength = Array.from(wordLengthMap.values()).sort((a, b) => b - a)[0]
Array.from(wordLengthMap).find(([word, length]) => length == maxLength)[0]  // => greatest
0Like

Comments

  1. @sharp231

    Questioner

    改善しました

例題を日本語に翻訳してはダメです!
ーーーーーーーーー
例えば 「今日は史上最高の日です!」
For example: "Today, is the greatest day ever!"
ーーーーーーーーー
2 つの e (および 2 つの t) を持ち
it has 2 e's (and 2 t's)
ーーーーーーーーー
単語はスペースで区切られます。
Words will be separated by spaces.
ーーーーーーーーー
文字が繰り返される単語がない場合は、-1を返します。
If there are no words with repeating letters return -1.
ーーーーーーーーー

SearchingChallenge(str)。。。アルゴリズムを作成したい
Have the function SearchingChallenge(str) 。。。
ーーーーーーーーー

英文の設問がダメダメです。
翻訳もダメダメです。repeatには重なるの意味があります。


■設問
各単語に同じ文字が重複している数の最大数を求め、最大数である単語の中で最初に登場する単語を表示するjavascriptコードでロジックをしなさい。尚、最大数が0の時は-1を表示すること。

                   t  t 
"Today, is the greatest day ever!"
                 e  e       e e 

it has 2 e's (and 2 t's)  
答え:greatest

"This is a pen."

答え:-1

■まとめ
表題にあるアルゴリズムで答える必要はなくjavascriptのロジックを知りたい点は理解できました。

■アルゴリズム

頭の体操として記述します。

max=0
word="-1"
ascii[128]

for文で文章全体を1桁から末尾までループ

  空白なら   ブレーク処理と初期化
  空白以外なら 文字カウントとword形成
eofならブレーク処理を実施

■ブレーク処理
  ascii[128] の最大値とmaxを比較してword=に hotwordを設定しmaxも最大値にする
■初期化
  ascii[128] と hotwordを初期化
■文字カウント
  ascii[128] にforで得られた1桁をカウント
■word形成
  forで得られた1桁をhotwordに追記

0Like

Comments

  1. @sharp231

    Questioner

    ありがとうございます

    英文の設問は関しては私も全然最初からわけがわからない
    内容だなって思っています


function getWordWithMostRepeatedLetters(str){
	var ary=str.split(" ");
	var maxWord="";
	var maxWeight=0;
	for(var i=0;i<ary.length;i++){
		var weight=getWordWeight(ary[i]);
		if (maxWeight<weight){
			maxWeight=weight;
			maxWord=ary[i];
		}
	}
	if (maxWeight==0){
		return -1;
	}else{
		return maxWord;
	}
}
//重複ありの場合重複letter数を戻す。
function getWordWeight(word){
	var ary=word.split("");
	var max=0;
	for(var i=0;i<ary.length;i++){
		var cnt=0;
		for(var j=0;j<ary.length;j++){
			if (ary[i]==ary[j]){
				cnt++;
			}
		}
		if (max<cnt)max=cnt;
	}
	return max-1;
}

image.png

0Like

Comments

  1. @sharp231

    Questioner

    ありがとうございます

Your answer might help someone💌