IGT의 RGB에 관한 필기시험 문제

36168 단어
제목: 하나의 문자열은'R','G','B'로만 구성되어 있는데 어떻게 모든'R'을 앞에 나타내고 모든'G'가 중간에 있고 모든'B'가 마지막에 있습니까?
요구 사항: 요구 공간의 복잡도는 O (1) 이고 문자열 그룹을 한 번만 훑어볼 수 있습니다
사고방식: 세 개의 커서 i, j, k 유지
i는 시작을 가리키고 j는 끝을 가리키며 각각 R, B를 삽입하는 데 쓰인다
k는 역주행에 사용되며 R이 발견되면 앞의 i가 가리키는 대상과 교환하고 i가 뒤로 이동한다.B가 발견되면 뒤에 있는 j가 가리키는 대상과 교환하고 j가 앞으로 이동합니다
k와 j가 만나면 멈춘다

  
  
  
  
  1. #include<iostream>  
  2. using namespace std;  
  3. void f(char * str)  
  4. {    
  5.     int length=strlen(str);  
  6.     int i=0;  
  7.     int j=length-1;  
  8.     int k=0;  
  9.     while(k<=j)  
  10.     {  
  11.     //   R ,  i  ,i  ;  
  12.         if(str[k]=='R')  
  13.         {  
  14.             char tmp=str[i];  
  15.             str[i]=str[k];  
  16.             str[k]=tmp;  
  17.             i++;  
  18.           
  19.         }  
  20.         // B ,  j ,j  
  21.         else if(str[k]=='B')  
  22.         {  
  23.             char tmp=str[j];  
  24.             str[j]=str[k];  
  25.             str[k]=tmp;  
  26.             j--;  
  27.         }  
  28.         else 
  29.             k++;  
  30.     }  
  31. }  
  32.  
  33. void main()  
  34. {  
  35.     char str[]="GRGBRBGBBRRGBRBG";  
  36.     cout<<str<<endl;  
  37.  
  38.     f(str);  
  39.     cout<<str<<endl;  
  40. }

좋은 웹페이지 즐겨찾기