0

そのため、0〜9の範囲の6つの数字のセットを指定して、可能な組み合わせを見つける関数を作成するように最初に求められました編集入力が変更または異なる可能性があるため、ユーザーには入力のプロンプトが表示されることに注意してください。つまり、入力は 123456 または 099384 END EDITになります。この関数は、入力された 6 桁を繰り返し可能な回数使用しながら、3 桁の結果に対して可能なすべての組み合わせを返す必要があります。したがって、111 112 113 などのように返されます。

. 私は php/javascript ユーザーであり、ブラウザでオフライン ファイルを実行できるように javascript を選択しました。

これは私が以下に構築したもので、うまく機能します。

function findthree(nums) {
    for (var i = 0; i < 10; i++) {
        if (in_array(i, nums)) {
            for (var ii = 0; ii < 10; ii++) {
                if (in_array(ii, nums)) {
                    for (var iii = 0; iii < 10; iii++) {
                        if (in_array(iii, nums)) {
                            $('body').append('<div>' + i + '' + ii + '' + iii + '</div>');
                        }
                    }
                }
            }
        }
    }

}


function in_array(needle, haystack) {
    var length = haystack.length;
    for (var i = 0; i < length; i++) {
        if (haystack[i] == needle) return true;
    }
    return false;
}

私の質問は..「組み合わせの重複」を除くすべての組み合わせを表示する同様の関数を作成するにはどうすればよいですか。つまり、関数は 112 が既に返されているため 211 を返しません。また、456 が既に返されているため、654 は返されません。array_difference 関数を使用しようとしましたが、それがどのように機能するかを完全に理解することはできません。

よろしくお願いします。

編集 選択した回答の助けを借りて見つかった回答

function findthreenodupe(nums) {
    nums = $.distinct(nums);
    nums.sort(function(a, b) {
        return a - b
    });
    alert(nums);
    for (var i = 1; i < 10; i++) {
        if (in_array(i, nums)) {
            for (var ii = i; ii < 10; ii++) {
                if (in_array(ii, nums)) {
                    for (var iii = ii; iii < 10; iii++) {
                        if (in_array(iii, nums)) {
                            $('body').append('<div>' + i + '' + ii + '' + iii + '</div>');
                        }
                    } // end of iii for loop
                } // end of ii for loop
            } // end of i for loop
        }
    }
}
4

3 に答える 3

2

最初に行うことは、入力を並べ替えて、重複する数字を削除することです。たとえば、099384取得します03489

次に、 からすべての桁をチェックする必要さえなく0-9、配列インデックスを直接操作できます。if(in_array(i, nums))これにより、いくつかの作業が不要になり、醜い括弧を取り除くことができます。このようなものが動作するはずです:

for(var i=0; i<nums.length; i++){
    for(var ii=i; ii< nums.length; ii++){
        for(var iii=ii; iii<nums.length; iii++){
            $('body').append('<div>' + nums[i] + '' + nums[ii] + '' + nums[iii] + '</div>');
        }
    }
}

主な違いは、毎回最初のインデックスからではなく、前の数字から始まることです。これにより、各桁が>=その前の桁になることが保証され(ソートされているため)、ハンドシェイクの問題に似たものになります。

上記のサンプル入力 ( に改訂03489) については、以下で何を行っているかを視覚化できます。iiiループの各実行は数値です。各行はiiループ実行であり、各「ブロック」は外側のiループの実行です。

000 003 004 008 009
033 034 038 039
044 048 049
088 089
099

333 334 338 339
344 348 349
388 389
399

444 448 449
488 489
499

888 889
899

999

おまけ:この方法で見つけられる組み合わせのは、常にの異なる桁数の四面体数numsになります。

于 2013-09-10T15:09:16.033 に答える
0

次のコードは、4、5、6 の組み合わせを表示します。これまでの値を含めるように変更できます

for (var i = 4; i < 7; i++)
    for(var y = i; y < 7 ; y++)
        for(var z = y ; z < 7; z++)
            $('#result').append('<div>' + i + '' + y + '' + z + '</div>');

これは、あなたの望むことですか。JSFIDDLE

于 2013-09-10T15:09:03.423 に答える
0
function findthree(nums) {
for (var i=0; in_array(i, nums); i++)
  if(in_array(i, nums))  
    for (var j=i; in_array(j, nums); j++) 
       if(in_array(j, nums) 
          for (var k=j; in_array(k, nums); k++)
             if(in_array(k, nums) {
               // other stuff
             }

結果に同じ数字 (112、133 など) を 2 回以上含むトリプレットを含めたくない場合は、+1 を追加しないように初期値を変更します...

function findthree(nums) {
for (var i=0; in_array(i, nums); i++)
  if(in_array(i, nums))  
    for (var j=i+1; in_array(j, nums); j++) 
       if(in_array(j, nums) 
          for (var k=j+1; in_array(k, nums); k++)
             if(in_array(k, nums) {
               // other stuff
             }
于 2013-09-10T15:11:39.043 に答える