ImageVerifierCode 换一换
格式:DOCX , 页数:37 ,大小:30.01KB ,
资源ID:12207901      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12207901.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(1字符串相关试题总结.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

1字符串相关试题总结.docx

1、1字符串相关试题总结字符串相关试题总结1. 字符串反转1.1 char* Reverse(char* s) /将q指向字符串最后一个字符 char* q = s ; while( *q+ ) ; q -= 2 ; /分配空间,存储逆序后的字符串。 char* p = new charsizeof(char) * (q - s + 2) ; char* r = p ; / 逆序存储 while(q = s) *p+ = *q- ; *p = 0 ; return r ;1.2 void strRev( char *s/*,char *out*/) char temp; char *end= s

2、+ strlen(s) - 1;/指向字符串s最后一个字符 while(end s) temp=*s; *s=*end; *end=temp; -end; +s; 编程翻转字符串,优化速度、优化空间。解答:这是网络流传的Microsoft的面试题目之一:“编写反转字符串的程序,要求优化速度、优化空间”。因为最近一直很多关注算法方面的实践和研究,因此对这个问题进行了一些思考,给出了5种实现方法(有两种解法相关性比较大)。这是网络流传的Microsoft的面试题目之一:“编写反转字符串的程序,要求优化速度、优化空间”。因为最近一直很多关注算法方面的实践和研究,因此对这个问题进行了一些思考,给出了5

3、种实现方法(有两种解法相关性比较大)。解法一:第一次看到这题目,想到最简单、最直觉的解法就是:遍历字符串,将第一个字符和最后一个交换,第二个和倒数第二个交换,依次循环,即可,于是有了第一个解法:char* strrev1(const char* str)int len = strlen(str);char* tmp = new charlen + 1;strcpy(tmp,str);for (int i = 0; i tmp)char t = *tmp;*tmp = *p;*p = t;-p;+tmp;return ret;显然上面的两个解法中没有考虑时间和空间的优化,一个典型的优化策略就是两

4、个字符交换的算法优化,我们可以完全不使用任何外部变量即完成两个字符(或者整数)的交换,这也是一个很经典的面试题目。特别是一些嵌入式硬件相关编程中经常要考虑寄存器的使用,因此经常有不使用任何第三个寄存器即完成两个寄存器数据的交换的题目。一般有两个解法,对应这里的解法三和解法四。解法三的实现代码为:char* strrev3(const char* str)char* tmp = new charstrlen(str) + 1;strcpy(tmp,str);char* ret = tmp;char* p = tmp + strlen(str) - 1;while (p tmp)*p = *tmp

5、;*tmp = *p; *p = *tmp;-p;+tmp;return ret;解法四的实现代码为:char* strrev4(const char* str)char* tmp = new charstrlen(str) + 1;strcpy(tmp,str);char* ret = tmp;char* p = tmp + strlen(str) - 1;while (p tmp)*p = *p + *tmp;*tmp = *p - *tmp;*p = *p - *tmp;-p;+tmp;return ret;实际上我们还可以通过递归的思想来解决这个问题,思想很简单:每次交换首尾两个字符,

6、中间部分则又变为和原来字符串同样的问题,因此可以通过递归的思想来解决这个问题,对应解法五的实现代码为:char* strrev5(/*const */char* str,int len)if (len = 1)return str;char t = *str;*str = *(str + len -1);*(str + len -1) = t;return (strrev5(str + 1,len - 2)-1);以下给出一个测试程序:int main(int argc,char* argv)char* str = hello;printf(str);printf(n);char* str2

7、= strrev1(str);printf(str2);printf(n);char* str3 = strrev2(str2);printf(str3);printf(n);char* str4 = strrev3(str3);printf(str4);printf(n);char* str5 = strrev4(str4);printf(str5);printf(n);char* str6 = strrev5(str5,strlen(str5);printf(str6);printf(n);return 0;你就可以看到字符串hello和olleh交替输出了。说明:1)这里解法中没有认真考

8、虑输入字符串的合法性和特殊长度(如NULL、一个字符等)字符串的处理;2)前4个算法不改变输入字符串的值,解法五修改了输入字符串。2. 实现库函数strcpy的功能void strcpy(char *dest,const char *src)assert(dest!=NULL & src!=NULL);while(*src!=0)* dest +=* src +;* dest =0;3. 实现atoi函数,itoa函数 3.1 int atoi( const char *s) if(s = NULL) return 0; int result = 0; if( (0= s0 & s0 = 9)

9、 |(s0=-) | s0=+) if(s0 = + | s0 = -) s+; else return 0; while(0= *s & *s = 9) result = result*10 + (*s+ - 0); if (sign=-1) result*=sign; return result;说明:const char* str; 是修饰字符串不能改变的,而不是指针, 修饰常量指针的是char* const str;那我就说说吧:const int * const pint; /一个const指针,指向一个const成员const int * pint; /一个非const指针, 指向

10、一个const成员int *pint; /一个非const指针,指向一个非const成员int * const pint; /一个const指针,指向一个非const成员int const * pint; /和第二个一样, 一个非const指针, 指向一个const成员, 这个不常用3.2 itoa函数 实现 /实现itoa函数/整形转成字符串函数实现 /题目不难,重点考察面试者对问题考虑的全面程度 void itoa_mf(int num,char str) int sign = num; int i = 0; int j = 0; char temp100; /如果是负数就去掉符号,将-1

11、234转成 if(sign 0); /如果是负数的话,加个符号在末尾,如:4321- if(sign -1234 while(i = 0) strj = tempi; j+; i-; /字符串结束标识 strj = 0; 3.3(01)写一个将整数转换成字符串的函数itoa解析:整数转化成字符串,可以采用加0,然后再逆序,整数加0就会隐形转化为char类型的数。int main(void) int num = 12345, j=0, i=0; char temp7, str7; while(num) tempi = num%10 + 0; i+; num = num/10; tempi = 0

12、; printf(temp = %sn,temp); i=i-1; while(i=0) strj = tempi;/字符串反转 j+; i-; strj=0; printf(string = %sn, str); return 0;(02)编程实现字符串数转化成整数的方法。解析:可以采用减 0 再乘10累加的方法,字符串减 0 就会隐性转换为int类型的数#include#includeint main(void) int num=12345, j=0, i=0, sum=0; char temp7=1, 2, 3, 4, 5, 0, str7; while (tempi) sum=sum*

13、10+(tempi-0); i+; printf(sum=%dn, sum) return 0;4. /实现库函数strcat的功能void strcat_my(char * dst, const char * src) char *p = dst; while( *p ) p+;/p指针指向最后 while( *p + = *src + );5. 实现库函数strcmp的功能 /实现库函数strcmp的功能int strcmp_my (const char * src, const char * dst)/两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇0为

14、止 int ret = 0 ; while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) & *src) +src, +dst; if ( ret 0 ) ret = 1 ; return( ret );6. /计算字符串中元音字符的个数int is_vowel(char a) switch(a) case a: case A: case e: case E: case i: case I: case o: case O: case u: case U: return 1; break; default: return 0;

15、break; int count_vowel(const char *s) int num; if(s0 = 0) num = 0; else if(is_vowel(s0) num = 1 + count_vowel(&s1); else num = count_vowel(&s1); return num;7. /* *函数名称:fun *描述:对一个字符串重新排列,字母排在前面,数字排在后面,并不改变原来字母之间以及数字之间的字符顺序。 *参数:char * s,int *m *返回值:chLetter(数组chLetter的首元素地址) *局部变量:char chLetterN; *

16、char chNumberN; * int i,j,k; */char * fun(char * s,int *m) /参数m是通过调试才想到的 char *src=s;/定义一个src指针指向原字符串,便于操作src计算字符串长度 int count=0;/统计字符串的个数 while(*src+) count+; char *pchLetter=new charcount; /用来存放字母 char *pchNumber=new charcount; /用来存放数字 memset(pchLetter,0,count); memset(pchNumber,0,count); int i,j,

17、k; j=0; /j用来记录字母的个数 k=0; /k用来记录数字的个数 for (i=0; i= A & si = a & si =0 & si =9) /将数字存入chNumber pchNumberk=si; k+; pchLetterj= ; pchNumberk=0; *m=j+k; /用来返回最后的字符和数字个数之和 strcat_my(pchLetter,pchNumber); return pchLetter;8. /* *函数名称:fun *描述:将s所指字符串中最后一次出现的与t1所指字符串相同的子串替换为t2所指字符串 *参数:char * s,char * t1, ch

18、ar * t2,int *m *返回值:w(数组w的首元素地址) *局部变量:char wN; * char tempT; * char t1tempT; * int i,j,k,l; */void fun(char * s,char * t1, char * t2,char*w) char *src=s;/定义一个src指针指向原字符串,便于操作src计算字符串长度 int count=0;/统计字符串的个数 while(*src+) count+; /int count=strlen(s);也可以 int t1_count=strlen(t1); char *temp=new chart1

19、_count+1;/用来存放从s所指字符串中截取的子串 char *t1temp=new chart1_count+1;/用来存放t1所指字符串 memset(temp,0,(t1_count+1); memset(t1temp,0,(t1_count+1); int i,j,k,l; /向t1temp中存入t1所指字符串 for (i=0; it1_count;i+) t1tempi=t1i; t1tempt1_count=0; /寻找相同时的最后一个字符的下标 for (i=0; icount; i+) l=0; for (j=i;j(i+t1_count); j+,l+) /截取长度为T

20、的子串存到temp中 templ=sj;/找到子串后立刻处理(和t1字符串比较) tempt1_count=0; if (strcmp(t1temp,temp) = 0) k=i; /k记录相同时的最后一个字符的下标 j=0; for (i=0; i=k & i1时,Perm(R)可由(r1)Perm(R1),(r2)Perm(R2),(rn)Perm(Rn)构成/此程序就是按照上述思想来设计的/其中:/ Perm(list,k,m)递归地产生所有前缀是list0:k-1,且后缀是listk:m的全排列的所有排列。那么调用算法Perm(list,0,n-1)则产生list0:n-1的全排列。/

21、 for (i=k; i = n; i+) / Swap (listk, listi); / Perm (list, k+1, n); / Swap (list k, list i); / /以上这段代码其实就是实现的(2)的思想。 #include stdafx.h#include iostreamusing namespace std;void Swap(char& a, char& b) char temp; temp = a; a = b; b = temp;void Perm(char s, int k, int m) if(k = m) / Print one permutatio

22、n. cout s endl; else for(int i = k; i = m; i+) Swap(sk, si); Perm(s, k +1, m); Swap(sk, si); int _tmain(int argc, _TCHAR* argv) char s = 123; Perm(s, 0, 2); return 0;9.1.2 也是递归实现123的全排列有123、132、231、231、312、321这六种。首先考虑213和321这二个数是如何得出的。显然这二个都是123中的1与后面两数交换得到的。然后可以将123的第二个数和每三个数交换得到132。同理可以根据213和321来得

23、231和312。因此可以知道全排列就是从第一个数字起每个数分别与它后面的数字交换。 void Permutation(char* pStr, char* pBegin) assert(pStr & pBegin); if(*pBegin = 0) printf(%sn,pStr); else for(char* pCh = pBegin; *pCh != 0; pCh+) swap(*pBegin,*pCh); Permutation(pStr, pBegin+1); swap(*pBegin,*pCh); int _tmain(int argc, _TCHAR* argv) char str = abc; Permutation(str,str); return 0;9.1.3 有重复/在nBegin,nEnd)区间中是否有字符与下标为pEnd的字符相等bool IsSwap(char* pBegin , char* pEnd) char *p; for(p = pBegin ; p pEnd ; p+) if(*p = *pEnd) return false; re

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1