首页 > 代码库 > 利用快慢下标操作字符串数组

利用快慢下标操作字符串数组

1.去除掉多余的空格: 

e.g.

Before:   Life___is__short___I___use___python_‘\0‘(下划线为空格)

After:  Life_is_short_I_use_python‘\0‘ (去除掉多余的空格)

 

去掉空格比较简单,我们可以通过逐个判断字符,如果有连续的空格就使数组左移直到只剩一个空格,可是这么做效率十分低下; 

前面学习过利用快慢下标的方法实现快排思想,这里也可以采用类似的方法 : 

对于删除后的数组,长度将减少或者不变,则指向删除后数组的下标是慢下标,另一个自然是快下标

!!我们这里暂时不考虑除空格外的其他空白字符如何处理(假设字符串数组中的空白字符只有空格):

 1 void trim_space(char *str)
 2 {
 3     int index_i=0,index_j=0;
 4     while(str[index_j]){
 5         if(str[index_j]!= ||(str[index_j]== &&index_i!=0&&str[index_i-1]!= )){
 6             str[index_i++]=str[index_j++];
 7         }else{
 8             index_j++;
 9         }
10     }
11     if(str[index_i-1]== ){
12         str[index_i-1]=\0;
13     }else{
14         str[index_i]=\0;
15     }

16 } 

 

快慢下标还可以用来实现将字符串中的空格转换成%020

‘ ’转换成“%020”: 

和去除掉多余的空格一样,先找到两个遍历速度不同的下标。

在本例中,转换后的数组长度要增加,如果采取从后向前遍历的方式,则遍历新数组的指针为较快指针 

 

 1 void reserve_space(char *str)
 2 {
 3     int count=0;
 4     int index;
 5     for(index=0;str[index];index++){
 6         if(str[index]== ){
 7             count++;
 8         }
 9     }
10     index=strlen(str);
11     int index_j=index+count*3;
12     while(index_j>=0){
13         if(str[index]!= ){
14             str[index_j--]=str[index--];
15         }else{
16             str[index_j--]=0;
17             str[index_j--]=2;
18             str[index_j--]=0;
19             str[index_j--]=%;
20             index--;
21         }
22     }

23 } 

 

利用快慢下标或者快慢指针可以较为便捷的解决很多问题  一定要掌握这种方法 

 

利用快慢下标操作字符串数组