소 제공 고객 네트워크 (13)는 안전 문제를 증명하기 위해 - 짝수 홀수 앞에있는 배열의 같은 조정 순서를

주제 출처 : 안전 서비스를 증명

주제 :

       배열 번호의 순서를 조절하는 기능을 실현하기 위해, 정수의 배열을 입력 어레이의 전반의 모든 홀수 부분은 홀수 어레이 전체의 후반에있는 홀수 간의 상대적 짝수, 홀수되도록 심지어 지도록 동일한 위치.

문제 해결 아이디어 :

      배열 클래스 항목의 지침 : 매우 주제의 배열의 가장 좋아하는 주제를 바보 이외에 "이중 색인"전략에 사용하지만, 일부 사용 히트에 대한 포인터를, 일부 사용 포인터를 다음합니다.

     우리는 단지 배열의 예를 제공, 그것이 더 적절한 수행하는 방법 분석 : 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 개의 요소를 가지고
  • 어디에서 문제의 배열은 거의 두 배 인덱스는 반드시 해결 방안이되고있다.

세 가지 모두를 기록해 둡니다! ! !

추천

출처www.cnblogs.com/shaonianpi/p/12357206.html