주제 출처 : 안전 서비스를 증명
주제 :
배열 번호의 순서를 조절하는 기능을 실현하기 위해, 정수의 배열을 입력 어레이의 전반의 모든 홀수 부분은 홀수 어레이 전체의 후반에있는 홀수 간의 상대적 짝수, 홀수되도록 심지어 지도록 동일한 위치.
문제 해결 아이디어 :
배열 클래스 항목의 지침 : 매우 주제의 배열의 가장 좋아하는 주제를 바보 이외에 "이중 색인"전략에 사용하지만, 일부 사용 히트에 대한 포인터를, 일부 사용 포인터를 다음합니다.
우리는 단지 배열의 예를 제공, 그것이 더 적절한 수행하는 방법 분석 : 2474358109;
이 시간 그래서, 당신이 얼마나 물론, 물론, 우리는 모든 홀수 및 모든 짝수 찾을 필요가있다. : 찾기 이러한 생각에 기초하여, 물론 우리는 이것을 가능 어레이의 패리티를 결정하는 각 요소의 처음부터 끝까지, 다음 홀수 번째의 원래 공간 배열의 순서와 동일한 크기의 어레이, 신선한 위에 스캔 생성 다음 첫 번째 배열의 절반, 그리고이도 넣어 새로운 배열, 의심의 여지 하반기로 스캔하지만,보기의 전략 지점의 결과, 아무런 문제가 없다, 문제는 : 우리는 원래의 배열을 사용하여 공간의 동일한 어레이. 이 좋은 방법이 아닌, 알 수있는이 복잡하게되는 시간 및 공간 복잡성은 O (N)이다. 그렇게 할 수있는 더 좋은 방법이 있나요?
물론,이 있습니다 :
우리가 일을 끝낼 것을 잊지 마십시오 것은 : 원래 순서에 따라 앞으로 홀수는 심지어 원래 순서대로 다시 넣어. , 데이터 이동이 그것을 원하는 달성하기 위해 할 수있는 것이, 우리는 원래의 공간에 전용 할 수 있습니까? 대답은 '예'입니다.
그래서 우리가 보낼 자연적인 질문은 우리가 이것을 이동하는 경우?
물론, 이러한 움직임까지도 존재 사이 먼 홀수 (좌) 전방 그 멀리있다. 다음이 경우, 분명히이 두 홀수 및 짝수 식별하기 위해 두 개의 인덱스가 필요합니다. 예를 순서 위의 경우 : 247, 우리는 물론 올바른 순서 (724)를 알고있다. 그래서 우리는 어떻게해야합니까?
코드 :
나는 다음과 같은 핵심 코드, 당신은 아마 이해할 수 제공 :
. (1) TMP = 배열 [J]; // 홀수 캐시 2 대 ( INT K = J를, K> I가, K-- ) 3. 배열 [K] = 배열 [- K- 1이다. ] . 4 어레이 [I] = TMP ; // 홀수 위치에 놓여 있다는 것이해야
분명히, 우리의 접근 방식은 다음과 같습니다 변수에 캐시 7, 다음, 모든 짝수 하나 개의 단위로 뒤로 이동합니다 후 7 그것은 장소에 배치한다. 이 코드의 핵심 아이디어는이 문제를 해결하는 것입니다.
하지만 난 여전히 디버깅 과정에서 이러한 문제 배열 경계가 발생했습니다 :
나는 참조 아래에 내 전체 코드를 넣어 :
1 급 솔루션 { 2 공개 : 3 공극 reOrderArray (벡터 < INT > 및 배열) { // 토우 포인터 4 INT 길이 = () array.size; 5 int로 난 = 0 ; // 奇数索引位置 6 INT J = 0 ; 7 INT 의 tmp; 도 8 의 경우 (길이> 1 ) 9 { 10 동안 ((ⅰ <길이) && (j < 길이)) 11 { 12 반면((I <길이) && (배열 [I]는 % 2 == 1. )) (13) { // 제 짝수 발견 14 I ++ ; 15 } 16 J = I +을 . 1 ] . 17 그동안 ((J <길이) && (배열 [J] % (2) == 0 )) (18)가된다 { //는 제 홀수 발견 19. J를 ++ ; 20이다 } (21)는 IF ((J == 길이) || (I == 길이)) (22)가 BREAK는 , 23이며 어레이 = TMP [J]; // 홀수 캐시 (24) 에 대한 ( 하는 int K = J, K> I; K-- ) 25 어레이 [K]가 = 어레이 [- K- 1. ] (26)가 배열 [I] = TMP; // 위치로 홀수가되어야 27 } 28 } 29 } 30 };
코드 위, i 및 j는 이중 인덱스를 표현한다. 위의 코드에서, 어레이 인덱스 값 및 길이의 I i와 j 번 길이 목적은 국경을 방지하고, 비교한다.
예를 들면 : (길이> 1), 적어도 두 개의 어레이 요소가 있다는 것을 설명하는 경우 시작. 다음 첫번째 홀수 하나조차, 우리는 또한 제한을 추가 찾기 전 <길이와 J <길이. 전체 어레이가 추가 또는 모든 홀수 및 짝수 필연적 국경에 이끌 여기서 같은 국경을 방지하기 위해.
요약 :
나는 핵심 코드를 그림으로 생각하는 것은 많은 시간이 아니라, 배열 범위를 방지하는 문제는 오랫동안 던져, 그들은 마지막으로, 내가보기는 점을 보여주고 싶은 제출할 :
- 문제의 배열을 적시 경계 제약으로, 국경 문제를 고려하는 바인딩입니다.
- 배열이 비어있는 경우 문제의 배열, 우리는 고려해야합니다, 배열의 요소가 배열이 사건의 n 개의 요소를 가지고
- 어디에서 문제의 배열은 거의 두 배 인덱스는 반드시 해결 방안이되고있다.
세 가지 모두를 기록해 둡니다! ! !