トピック1:重複数の配列を見つけます
長さnの配列では、すべての数値はである0〜N-1の範囲。一部のデジタル配列が重複しているが、各回数が数回繰り返したかわからない、繰り返し何の数字かわかりません。配列見つけてくださいいずれかの番号の重複を。例えば、入力アレイ7 {2、3、1、0、2、5、3}の長さがあれば、対応する出力は繰り返し数2又は3です。
アイデア:
この質問は私の最初の考えは、図のように、スキャン順にスキャンを開始から終了までに、ハッシュテーブルの配列は、ハッシュテーブルが含まれていない使用することです見た後スキャン・デジタルハッシュテーブルが代表を含まれている追加されますデジタル数が繰り返され、繰り返し数が返されます。アルゴリズムの時間計算量はO(N)であり、それはハッシュテーブルにはO(n)の大きさを有していなければならないコストの時間効率を高めます。インタビューで、インタビュアーは、プログラマに加えて、問題を解決するかどうかを検討しますが、また、彼のような、思慮深いことができるかどうかを懸念し、時間の複雑さとスペースで可能な限り低くアルゴリズムの複雑の使用。
第二の方法は、隣接する2桁が同じ符号を識別するために、アレイは、その後比較され、配列をソートすることです。長さnのソーティング配列はO(nlogn)時間を要します。この方法の時間複雑度は比較的高く、その後は良い解決策がないかどうかを確認します。
全ての数値であることを繰り返しタイトル、メモを見るN-1に0を配列に重複数、iは添え字位置Iの次の発生を排出するために、次に、シーケンス番号が含まれていないそうであれば、範囲。これ[I]配列スタートnにスキャンをスキャン完了するために、配列決定することができる、それが決定され、Nである[I] Iに等しく、次のスキャンを、正しい位置にそれを表している、いない場合は、最初の添字を決定nは[I]の数字は、我々はその重複番号を見つけることになる場合であって、ループを終了し、この数値を返すことは、それが低い標識コーナーN [i]は数字の[I] nは数字であろうことができない、私に等しいかどうかを交流。スキャンが完了する配列であるまで、それは循環してきました。完全な配列後のサイクルはまだ戻り値がない場合は、配列が重複する数字を表していません。
注:インタビューでインタビュアーは非常に良い印象をもたらすでしょう、良い習慣である、書き込みユニットテストケースに関数を書くの問題を解決する前に。
キーコードの実装:
1 プライベート 静的 INT checkDuplicate(INT [] AR){ 2 INT 複製; 3 。4 IF(アルゴン== NULL){ // 空の配列を避ける 5。 復帰 -2 ; 6 } 。7 8。 ため(INT I = 0。 I <ar.length; I ++){ // コンテンツフォーマットの回避エラーアレイ 9。 IF(AR [I] <0 || AR [I]> ar.length - 1。){ 10 リターン -3 ; 11 } 12である } 13のIS 14 のために(INT iは= 0; I <ar.lengthは、I ++ ){ 15は 、一方(!AR [I] = I){ 16 であれば(AR [I] == AR [AR [I]]){ 17 重複= AR [i]は、 18 のSystem.out.println( 19 「アレイが重複番号が含まれています。」 20 +「重複数の一つである:」+ 重複)。 21 リターン重複; 22 } 23 スワップ(AR、I、AR [I])。 24 } 25 } 26で リターン -1 ; 27 } 28 添字Cのデジタル交換のため//配列、およびd 29は プライベート 静的 ボイドスワップ(INT []のAr、int型の C、int型D){ 30 のint TEMP = AR [C]。 31は [C] =のAr であり、Ar [D] 32 AR [D] = TEMP; 33です }
次に、テストコード
テストと完全なコード:
1 パブリック クラスDuplication3 { 2 公共 静的 ボイドメイン(文字列[]引数){ 3。 INT [] = {A. 3 ,. 4 ,. 1、0、2、。5 ,. 6}; // 配列が重複番号を含んでいない 。4 INT [ ] B = {3 ,. 4 ,. 1、0、2、。5 ,. 3}; // 反復を含む配列番号 5 のint [] = {C. 4 ,. 6 ,. 1、0、2、。5、0}; / / 配列の繰り返し数が最小である 6。 INT [] = {D. 4 ,. 6 ,. 1、0、2、。6 ,. 5}; // 最大繰り返し数の配列 。7 INT [] = {E 2、。3、 1、0、2、5、3}; // デジタル繰り返さ複数含むアレイ 。8 INTを [] = F {2、3、1、0、-1、5、3}; //エラーアレイにおける数値形式 9。 INT [] = {G 2 ,. 3 ,. 1,0 ,. 8 ,. 5 ,. 3}; // 配列がより-1配列の長さ数より大きい含ま 10 のint [] H = ヌル; 11 12は、 テスト( "TEST1" 、A) 13は、 テスト( "TEST2" 、B); 14 試験( "Test3は" 、C); 15 試験( "TEST4" 、D); 16 試験( "TEST5" 、E) 。17 試験( "TEST6" 、F)、 18で テスト( "TEST7" 、G) 。19 試験( "TEST8" 、H)。 20 } 21 22 プライベート 静的 ボイド試験(文字列S、INT [] AR){ 23 のSystem.out.println(S + ":" )。 24 int型 K = checkDuplicate(AR)。 25 もし(K <0 ){ 26 スイッチ(K){ 27 ケース -1 : 28 のSystem.out.println( "!この配列の重複数" )。 29 ブレーク; 30 ケース -2 : 31 のSystem.out.println( "この配列がnullであります!" )。 32 ブレーク; 33 ケース -3 : 34である のSystem.out.println( "アレイコンテンツが不正このように設定されている!" ); 35 } 36 } 37 } 38が 39 プライベート 静的 INT checkDuplicate(INT [] AR){ 40 INT 重複、 41は 42である IFアルゴン(Ar = = NULL){ // 避け空の配列 43が リターン -2 、 44である } 45 46である ため(INT I = 0; I <ar.length; I ++){ //避免出现数组内容格式错误 47 であれば(AR [i]が<0 || AR [I]> ar.length - 1 ){ 48 リターン -3 。 49 } 50 } 51 52 のために(INT I = 0、I <ar.length; I ++ ){ 53 ながら(!AR [I] = I){ 54 であれば(AR [I] == AR [AR [I] ){ 55 重複= AR [i]は、 56 のSystem.out.println( 57 "アレイが重複番号が含まれています。" 58 +「重複数の一つがある:」+ 重複)。 59 リターン重複; 60 } 61 スワップ(AR、I、AR [I])。 62 } 63 } 64 リターン -1 。 65 } 66 67 プライベート 静的 ボイドスワップ(INT [] AR、int型の C、int型D){ 68 のint TEMP = AR [C]。 69 AR [C] = AR [D]。 70 AR [D] = TEMP。 71 } 72 }