现在的位置: 首页 > 综合 > 正文

一道IGT的关于RGB的笔试题

2013年01月29日 ⁄ 综合 ⁄ 共 850字 ⁄ 字号 评论关闭

题目:一个字符串只有‘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. }

抱歉!评论已关闭.