숫자의 배열 (Java 버전) 반복 : 얼굴 질문 3 offer-- 안전을 증명하려면

주제 하나를 중복 숫자의 배열을 찾을 수

      길이 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의 다음 발생을 배출되는 다음 시퀀스 번호를 포함하지 않도록하는 경우, 범위. 그것은 그러한 시퀀싱 수, 배열은 스캔 스캔 완료 시작 N [I]가 결정 n은 [I]에 올바른 위치에 그것을 나타내는 다음 스캔 그럼, 동일 임 아닌 경우 먼저 첨자 n은 결정 여부 [I] 숫자는 그 다음 우리는 루프, 다음은 N 표시된 아래 모서리에있는 [I] 숫자 N [] 수있을 것입니다 수 없습니다 종료 반환이 수를 중복 번호를 찾은 것의 경우, 내가 같음 교환. 스캔이 완료 배열 때까지 순환하고있다. 전체 배열 후주기가 여전히 반환 값이없는 경우, 배열은 중복 번호를 표시하지 않습니다.

참고 : 면접관은 매우 좋은 인상을 가져올 것이다 인터뷰에 좋은 습관이다 쓰기 단위 테스트 케이스에 기능을, 쓰기의 문제를 해결하기 전에.

키 코드 구현 :

. (1)      개인  정적  INT checkDuplicate ( INT [] AR) {
 2          INT 중복]
 . 3  
. 4          IF는 AR (== 는 null ) { // 빈 배열을 방지 
5.              수익 -2 ]
 . 6          }
 . 7  
. 8           ( INT I = 0; I <ar.length; I ++) { // 콘텐츠 포맷 않도록 에러 어레이 
9.              IF (Ar은 [I] <0 || 아르곤 [I]> ar.length - 1. ) {
 10                  반환 -3 ]
 . 11              }
 12이다          }
 13은 
14           ( INT 난 = 0; I <ar.length가 나는 ++ ) {
 15              동안 (! AR [I] = I) {
 16 일                  경우 AR ([I] == 억세스 라우터 [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 [] 아르곤, INT C, INT d) {
 30          INT의 TEMP = 아르곤 [C]
 31은          Ar은 [C]가 = ; 아르곤 [D]를
 32          에 Ar [D가 = ; TEMP
 33이다      }

 

 다음, 테스트 코드

테스트 및 전체 코드 :

. (1)  공용  클래스 Duplication3 {
 2      공용  정적  무효 메인 (문자열 [] 인수)을 {
 . 3          INT [] = {A. 3 ,. 4 ,. 1, 0 ,. 5 ,. 6 2} // 배열 중복 숫자를 포함하지 않는다 
. 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          지능 [] F = {2, 3, 1, 0, -1, 5, 3} //오류 배열 번호 형식 
9.          INT [] = {G 2 ,. 3 ,. 1, 0 ,. 8 ,. 5 ,. 3} // 배열은 숫자보다 -1 어레이 길이가 포함 된 
10          지능 [] H = ]
 . (11)          
(12)는          테스트 ( "TEST1" , A),
 (13)는          시험 ( "TEST2" ], B)
 (14)          테스트 ( "테스트 3" , C)
 (15)          테스트 ( "테스트 4" , D)
 16          시험 ( "Test5" , E)
 . 17          시험 ( "TEST6 ' , F)
 (18)는          시험 ("TEST7 " , G)
 . 19          시험 ("TEST8 " , H);
20      }
 21  
22     개인  정적  무효 시험 (문자열들, 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 = =  ) { // 피 빈 어레이 
(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가 나는 = 0; I <ar.length가 나는 ++ ) {
 53              동안 (! AR [I] = I) {
 54                  의 경우 (AR [I] == 억세스 라우터 [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의 임시은 = [C] 아칸소;
(69)          AR [C]가 = [D]를 아칸소;
(70)          AR [D] = 온도;
71      }
 72 }

 

추천

출처www.cnblogs.com/Roy-chencainiao/p/11939030.html