質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

4913閲覧

配列に入ってない数で最小の値を求める

MasakazuFukami

総合スコア1869

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/12/27 02:38

いつもお世話になっております。

今日はある問題に関してお聞きしたいです。

ある問題の内容はこちらです。

ある配列がある。 その配列に含まれない数で最小の値を求めよ。 最小の値minは0より大きい数とする。 例 var numList = [1, 4, 6, 8, 10] この場合は2 var numList = [3, 5, 9, 11] この場合は1

個人的に書いたコードが以下になります。
変数名などがちょっとイケてないのであれですが、、、

javascript

1// 1から与えられた数字までの配列を作る 2// 5 → [1,2,3,4,5] 3var untilListFromMaxNumber = function(maxNum){ 4 var _tmpArray = []; 5 6 for(var i = 1; i <= maxNum; i++){ 7 _tmpArray.push(i) 8 } 9 10 return _tmpArray; 11} 12 13// 2つの配列で重複していない数字の配列をつくる 14var diffArray = function(arrayFromMaxNum, originalNumList){ 15 var _tmpArray = [] 16 for(var i = 1; i <= arrayFromMaxNum.length; i ++){ 17 if (originalNumList.indexOf(i) === -1) { 18 _tmpArray.push(i) 19 } 20 } 21 22 return _tmpArray; 23} 24 25 26// 当たられた配列 27var numList = [1, 3, 5, 7, 8, 9, 13, 16]; 28 29console.log('最小値を求める') 30console.log('与えられた数値は', numList) 31 32// 最大値を取得 33var maxNum = Math.max.apply(null, numList) 34 35console.log('最大値は', maxNum) 36 37var untilList = untilListFromMaxNumber(maxNum) 38 39console.log('最大値までの配列は', untilList) 40 41var filterdArray = diffArray(untilList, numList) 42 43console.log('上記2つの配列の差分は', filterdArray) 44console.log('この配列の最小値が最初の配列にない数字の最小値') 45 46var resultNum = Math.min.apply(null, filterdArray) 47 48console.log('最小値は', resultNum)

これをconsoleで実行すると以下の画像のようになります。
イメージ説明

これはこれで出来てるのですが、漠然といけてないなあって思っていて、何かいい方法や書き方をいろんな方にご教示いただけないかなぁと思って投稿させて頂きました。

不適切な質問であったらすいません。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

模範解答はfor文を利用してこんな感じになるかと思います。

JavaScript

1// 当たられた配列 2var numList = [1, 3, 5, 7, 8, 9, 13, 16]; 3var minOf = function(numList) { 4 for (var i = 1; true; i++) { 5 if (numList.indexOf(i) === -1) { 6 return i; 7 } 8 } 9} 10console.log(minOf(numList));

Lodash.jsを使えば関数型プログラミング的に
もっと問題文をダイレクトにソースコードに書き起こせるようになるかと思いますが、
外部ライブラリを使用してもいいもか…という感じですね。

その視点であれば、イケてないと感じるコードもサラッとイケてる実装に変換できます。
実行パフォーマンスでは上記のfor文ゴリ押しには負けますが、
質問文のロジックをストンと落としたようなコードに変化しかっこいいですね。

このように関数やメソッド、ライブラリを知っていれば勉強すればした分だけ
思いついた内容をダイレクトにソースコードに変換出来るようになります。
基礎になるArray.prototypeも勉強してみてください。

JavaScript

1var numList = [1, 3, 5, 7, 8, 9, 13, 16]; 2var diffList = _.drop( 3 Array 4 .apply(null, {length: _.max(numList) + 2}) 5 .map(Number.call, Number) 6); 7console.log(_.min(_.difference(numList, diffList)));

※比較配列を作っているイディオム的な箇所は、Stack Overflowの記事を参考にしました。

投稿2016/12/27 03:19

編集2016/12/27 03:23
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasakazuFukami

2016/12/27 03:30

外部ライブラリが使えない状況だったのでlodashなどは一旦考えていませんでした! そして模範解答的なものありがとうございます! 複雑に考えすぎていました( ;∀;) Array.prototype見てみます!!!! ありがとうございます!!!
miyabi-sun

2016/12/27 03:32

余談なのでコメント欄ですが、関数型プログラミングの本場、Haskellでは遅延評価が出来ます。 与えられた配列の+1とは言わず1~無限の配列を作ってしまって、差分をとり、最小の数値だけ返すというロジックも最小の計算量で出来ます。 Haskellに限ってはループ文を使ったやり方と速度的に見ても遜色ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問