本题最大的困难是如何在不新建新的数组下完成空格替换,主要考察数组指针的运用
思路:(1)找出字符串空格的长度,从而确定新的子串尾指针的位置所在;
(2)通过遍历找出空格,string[indexOfNew--]依次附上%20三个字符,indexOfOriginal--
注:并没有通过实际指针而是通过字符串下标操作,起始时均指向末尾位置
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 /* 5 *Author xsf 6 *剑指offer,替换空格 7 */ 8 //求出传入数组的空格长度 9 int GetBankLen(char str[]) 10 { 11 int BankNum = 0; 12 char *p = str; 13 while(*p!=‘\0‘) 14 { 15 if(*p==‘ ‘) 16 BankNum++; 17 p++; 18 } 19 return BankNum; 20 } 21 /*置换空格的函数 22 length是字符数组string的总容量 23 */ 24 void ReplaceBlank(char string[],int length) 25 { 26 if(string==NULL||length<=0)//安全性判断 27 return; 28 int BankNum = GetBankLen(string);//获取输入string的空格数目 29 int newLength = length + BankNum*2; //移动数组后的总长度 30 // char *str1 = string+length-1;//第一个指针指向数组的最后\0位置 31 // if(*str1 ==‘\0‘) 32 // printf("指向了最后的\0"); 33 // char *str2 = string+newLength-1;//第二个指针指向替换后的最后\0位置 34 /*移动指针*/ 35 int indexOfOriginal = length; 36 int indexOfNew = newLength; 37 while(indexOfOriginal>=0&&indexOfNew>indexOfOriginal) 38 { 39 if(string[indexOfOriginal]==‘ ‘)//当遇到空格,则在新的加上%20 40 { 41 // printf("遇到空格/n"); 42 string[indexOfNew--] = ‘0‘; 43 string[indexOfNew--] = ‘2‘; 44 string[indexOfNew--] = ‘%‘; 45 } 46 else 47 { 48 string[indexOfNew--] = string[indexOfOriginal]; 49 } 50 indexOfOriginal--; 51 52 } 53 } 54 55 int main(int argc,char *argv[]) 56 { 57 char string[] = "X S F"; 58 int Totallen = sizeof(string)/sizeof(char);//包含/0 59 // int Strlen = strlen(string);//不包含/0 60 printf("替换前%s\n",string); 61 ReplaceBlank(string,Totallen); 62 printf("替换后%s\n",string); 63 // printf("len=%d\n",Totallen); 64 // printf("str=%d\n",Strlen); 65 // int BankNum = GetBankLen(string); 66 // printf("空格长度为%d\n",BankNum); 67 68 }
时间: 2024-10-21 18:32:05