基本上求职者进行笔试没有不考字符串的。字符串也是一种相对简单的数据结构,容易被考。事实上,字符创也是一个考验程序猿编程规范和编程习惯的重要考点。
1、替换空格:实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“we are happy。”则输出“we%20are%20happy。”
答案:用一个空的字符串去替换%,2,0三个字符,那么原字符就会变长从而覆盖掉后面的字符,我么可以考虑创建一个新的字符串并在新的字符串上面做替换,那样就能够分配足够的内存了。在这里我们可以考虑从后往前去替换字符串。这里创建两个指针
1 #include<iostream> 2 #include <string> 3 #include<cstring> 4 #include<cstdio> 5 #include<stdlib.h> 6 using namespace std; 7 /* 8 算法原理:准备两个指针p1,p2;p1指向原始字符串的末尾,p2指向替换之后的字符串的末尾。接下来我们向前移动指针p1, 9 逐个把它指向的字符复制到p2指向的位置,知道碰到第一个空格为止, 10 算法:先遍历一次字符串,记录空格的数目,在计算新的字符数组的长度 11 在从后往前进行替换 12 */ 13 char *copystr(char *s) 14 { 15 int len=strlen(s);//字符串的长度 16 int blank=0;//表示空格的数目 17 if(len==0) 18 { 19 return NULL; 20 } 21 if(s==NULL) 22 { 23 return NULL; 24 } 25 26 for(int i=0; i<len; i++) //判断字符串,确定空格的数目,从而确定新的字符串所需的个数 27 { 28 if(s[i]==' ') 29 blank++; 30 } 31 if(blank==0) 32 return s; 33 int new_len=blank*2+len;//计算新的字符数组的长度(本来不该加一,但是最后的输出要求加一) 34 int l=new_len+1;//这里' '也算一个长度 35 char *str1; 36 for(int i=len; i>=0; i--)//算法:有空格就赋值,没有空格直接复制,从后往前复制 37 { 38 if(s[i]!=' ')//从后往前复制 39 { 40 str1[l-1]=s[i]; 41 l--; 42 } 43 else//转换空格 44 { 45 str1[l-1]='0'; 46 str1[l-2]='2'; 47 str1[l-3]='%'; 48 l-=3; 49 } 50 } 51 return str1; 52 } 53 int main() 54 { 55 static char str[10000000]; 56 gets(str); 57 char *dest = copystr(str); 58 if(dest != NULL) 59 puts(dest); 60 dest = NULL; 61 return 0; 62 63 }
1 #include<iostream> 2 #include <string> 3 #include<cstring> 4 #include<cstdio> 5 #include<stdlib.h> 6 using namespace std; 7 /* 8 算法原理:准备两个指针p1,p2;p1指向原始字符串的末尾,p2指向替换之后的字符串的末尾。接下来我们向前移动指针p1, 9 逐个把它指向的字符复制到p2指向的位置,知道碰到第一个空格为止, 10 算法:先遍历一次字符串,记录空格的数目,在计算新的字符数组的长度 11 在从后往前进行替换 12 */ 13 char *copystr(char *s) 14 { 15 int len=strlen(s);//字符串的长度 16 int blank=0;//表示空格的数目 17 if(len==0) 18 { 19 return NULL; 20 } 21 if(s==NULL) 22 { 23 return NULL; 24 } 25 for(int i=0; i<len; i++) //判断字符串,确定空格的数目,从而确定新的字符串所需的个数 26 { 27 if(s[i]==' ') 28 blank++; 29 } 30 if(blank==0) 31 return s; 32 int new_len=blank*2+len;//计算新的字符数组的长度(本来不该加一,但是最后的输出要求加一) 33 int l=new_len+1; 34 // char *str1 = (char *)malloc(new_len*sizeof(char)+1); 35 char *str1; 36 for(int i=len; i>=0; i--)//算法:有空格就赋值,没有空格直接转换 37 { 38 if(s[i]!=' ') 39 { 40 str1[l-1]=s[i]; 41 l--; 42 } 43 else 44 { 45 str1[l-1]='0'; 46 str1[l-2]='2'; 47 str1[l-3]='%'; 48 l-=3; 49 } 50 } 51 return str1; 52 } 53 int main() 54 { 55 static char str[10000000]; 56 gets(str); 57 char *dest = copystr(str); 58 if(dest != NULL) 59 puts(dest); 60 dest = NULL; 61 return 0; 62 63 }
2、字符串的排列:输入一个字符串,打印出该字符串中字符的所有排列。例如:输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba
答案:递归的过程和这个图差不多。首先我们先固定第一个字符,后面的剩余字符是一部分。第一步我么先把第一个字符和后面的所有字符进行交换,得出第一个字符的所有可能(第一个字符可能出现的情况列出),之后我们在后面的字符部分当做一个字符串重复前面的方法,把第二个字符和后面的所有字符进行交换,得出其他的情况,依次递归重复上面的方法,直到最后一位字符停止。
1 #include<iostream> 2 #include<cstring> 3 #include<stdlib.h> 4 using namespace std; 5 /* 6 解题思路: 7 1.就是将字符串从第一个字符开始,依次和后面的字符进行交换,知道交换到末尾为止 8 ① ② 9 2.比如:abcd--acbd,a,a,a,-- 10 bacd--bcad-- 11 cbad--cabd-- 12 dbca--dcba-- 13 3.但是这个算法是不能有重复的字符的操作 14 */ 15 /* 16 交换函数:将前后两个字符进行交换 17 */ 18 int swap_str(char *str1,char *str2){ 19 char temp=*str1; 20 *str1=*str2; 21 *str2=temp; 22 } 23 /*这个函数是输出排列的函数*/ 24 void permutation(char *str1,char *begin){ 25 if(*begin=='