华为机试oj练习题2014_第1页
华为机试oj练习题2014_第2页
华为机试oj练习题2014_第3页
华为机试oj练习题2014_第4页
华为机试oj练习题2014_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、之所以抛弃char*的字符串而选用C+标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,= 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C+的基本数据类型。首先,为了在我们的程序中使用string类型,我们必须包含头文件 。如下: #include /注意这里不是string.h string.h是C字符串头文件读入一行字符:getline(cin,str);1声明一个C+字符串声明一个字符串变量很简单: string

2、Str;这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下:a) string s; /生成一个空字符串sb) string s(str) /拷贝构造函数 生成str的复制品c) string s(str,stridx) /将字符串str内始于位置stridx的部分当作字符串的初值d) string s(str,stridx,strlen) /将字符串str内始于stridx且长度顶多strlen的部分作为字符串的初值

3、e) string s(cstr) /将C字符串作为s的初值f) string s(chars,chars_len) /将C字符串前chars_len个字符作为字符串s的初值。g) string s(num,c) /生成一个字符串,包含num个c字符h) string s(beg,end) /以区间beg;end(不包含end)内的字符作为字符串s的初值i) s.string() /销毁所有字符,释放内存都很简单,我就不解释了。2字符串操作函数这里是C+字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。a) =,assign

4、() /赋以新值b) swap() /交换两个字符串的内容c) +=,append(),push_back() /在尾部添加字符d) insert() /插入字符e) erase() /删除字符f) clear() /删除全部字符 g) replace() /替换字符h) + /串联字符串i) =,!=,=,compare() /比较字符串j) size(),length() /返回字符数量k) max_size() /返回字符的可能最大个数l) empty() /判断字符串是否为空m) capacity() /返回重新分配之前的字符容量n) reserve() /保留一定量内存以容纳一定数量

5、的字符o) , at() /存取单一字符p) ,getline() /从stream读取某值q) ,=,=,=,!=),甚至支持string与C-string的比较(如 str,=,=这些操作符的时候是根据当前字符特性将字符按字典顺序进行逐一得 比较。字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。同时,string (aaaa) string(aaaaa)。 另一个功能强大的比较函数是成员函数compare()。他支持多参数处理,支持用索引值和长度定位子串来进行比较。他返回一个整数来表示比较结果,返回值意义如下:0-相等

6、 0-大于 从输入流读取一个string。2 把一个string写入输出流。另一个函数就是getline(),他从输入流读取一行内容,直到遇到分行符或到了文件尾。28搜索与查找查找函数很多,功能也很强大,包括了: find() rfind() find_first_of() find_last_of() find_first_not_of() find_last_not_of()这些函数返回符合搜索条件的字符区间内的第一个字符的索引,没找到目标就返回npos。所有的函数的参数说明如下:第一个参数是被搜寻的对象。第二个参数(可有可无)指出string内的搜寻起点索引,第三个参数(可有可无)指出搜

7、寻的字符个数。比较简单,不多说不理解的可以向我提出,我再仔细的解答。当然,更加强大的STL搜寻在后面会有提及。最 后再说说npos的含义,string:npos的类型是string:size_type,所以,一旦需要把一个索引与npos相比,这个索引值必须是string:size)type类型的,更多的情况下,我们可以直接把函数和npos进行比较(如:if(s.find(jia)= string:npos))。1、判断一个数是不是回文数,回文数为类似12321,4321234,987656789,12344321,186681 #include /#include using namespac

8、e std;int main(void)int i=0,n,len;cinn;int a20=0;while(n!=0)ai=n%10;n=(n-ai)/10;i+;len=i;for(i=1;i=len/2;i+)if(ai-1!=alen-i)break;if(i=len/2+1)coutYesn;elsecoutNon;return 0;#include #include using namespace std;int main(void)int i=0,len=0;string s;cins;while(si!=0)i+;len=i;/len=s.size();for(i=1;i=le

9、n/2;i+)if(si-1!=slen-i)break;if(i=len/2+1)coutYesn;elsecoutNon;return 0;#3、一群人围城一圈,编号为1N,有一个确定数A,从1号开始报数,每逢编号为A的倍数该人出列,要求按照顺序输出出列的人的编号 比赛题:第一题:有个自动售货机会自己找零,能塞进去以及吐出来的钱的面额为1、5、10、20、50、100,输如用户塞进去钱的面额和商品价格,要求输出找零信息,也就是说1、5、10、20、50、100各多少个例子:输入89100输出1 0 1 0 0 0#include #include using namespace std;i

10、nt main(void)int i=0,price,total,change,a6=1,5,10,20,50,100,a16=0;cinpricetotal;change=total-price;if(change!=0)for(i=1;i=6;i+)a16-i=change/a6-i;change=change-a16-i*a6-i;for(i=1;i=6;i+)couta1i-1;coutn;return 0;1.求int型数据在内存中存储时1的个数输入一个int型数据,计算出该int型数据在内存中存储时1的个数。#include using namespace std;int GetC

11、ount(int num)/*在这里实现功能*/int m=0;while(num)num &=(num-1);m+;return m;int main()int a;cina; coutGetCount(a)endl;2.句子逆序将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符#include using namespace std;void RS(char *bp, char *ep)while(bp ep)char tem = *bp;*bp = *ep;*ep = t

12、em;bp+;ep-;char* Reverse(char *s)int len = strlen(s);char *es = s + len -1;RS(s,es);char *p1 = s;char *p2 = s;while( *p2 != 0)while(*p2 != 0 & *p2 != )p2+;RS(p1,p2-1);if( *p2 = & *p2 != 0)p2+;p1 = p2;return s;int main()char str500;gets(str);coutReverse(str);3.字符串反转写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。#inc

13、ludeusing namespace std;int Reserve(char *str)int len=strlen(str);char *begin,*end;begin=str;end=begin+len-1;if(str!=NULL)while(beginend)char temp;temp=*begin;*begin=*end;*end=temp;begin+;end-;return 0;int main()char str1100;gets(str1);Reserve(str1);puts(str1);4.数字颠倒描述:输入一个整数,将这个整数以字符串的形式逆序输出程序不考虑负数

14、的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为0015.字符个数统计编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0127)。不在范围内的不作统计。#include #include using namespace std;int main()string str;int len,count=0;getline(cin,str);len=str.size();for(int i=0; i=0 &stri=127)for(int k=i+1; klen; k+)if(strk=stri)flag=0;break;if(flag)count+;cou

15、tcountendl;return 0;6.提取不重复的整数输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。#include using namespace std;int main()char a100,b100;gets(a);int len=strlen(a);for(int i=0;ilen/2;i+) /反转a数组char temp;temp=ai;ai=alen-1-i;alen-1-i=temp;b0=a0; /去掉a中重复的数字赋给b数组int j=0;for(int i=0;ilen;i+) int flag=1; for(int k=0;k=0

16、;i-) /输出最终的数字 sum+=(bi-48)*quan; quan*=10; coutsumendl;7.合并表记录数据表记录包含表索引和数值。请对表索引相同的记录进行合并,合并后表记录为相同索引表的数值求和#include #include using namespace std;struct Recordint Index;int Value;bool cmp(const struct Record a,const struct Record b)return a.IndexN;int flag=N;for(int i=0; iarrayi.Indexarrayi.Value;so

17、rt(array,array+N,cmp);/for(int i=0; iN; i+)/coutarrayi.Index arrayi.Value;for(int i=0; iN; i+)if(arrayi.Index=arrayi+1.Index)arrayi+1.Value=arrayi.Value+arrayi+1.Value;elsecoutarrayi.Indexendl;coutarrayi.Valueendl;return 0;8.取近似值写出一个程序,接受一个浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。#include using

18、 namespace std;int main() double a; cina; if (a=0) cout(int)(a+0.5); else cout(int)(a-0.5);9.质数因子功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )#include using namespace std; void getResult(long int input)for (int i=2;i=input;i+)while(0=input%i)&input!=0)coutia; getResult(a); return 0; 10.进制转换写

19、出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串#include using namespace std;int main()char a10;gets(a);int len=strlen(a);int sum=0,quan=1;for(int i=len-1;i1;i-)if(ai=0 &ai=A &ai=a &ai=f)sum+=(ai-87)*quan;quan*=16;coutsumendl;11.字符串分隔连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。#include using name

20、space std;int main()char str1100,str2100;gets(str1);gets(str2); while (1) if (strlen(str1)8) for (int i=0;i8;i+) coutstr1i; coutendl; for (int i=0;istrlen(str1)-8;i+) str1i=str1i+8; str1strlen(str1)-8=0; if (strlen(str1)8) coutstr1; for (int i=0;i8-strlen(str1);i+) cout0; cout8) for (int i=0;i8;i+)

21、coutstr2i; coutendl; for (int i=0;istrlen(str2)-8;i+) str2i=str2i+8; str2strlen(str2)-8=0; if (strlen(str2)8) coutstr2; for (int i=0;i8-strlen(str2);i+) cout0; coutendl; break; return 0;12.明明的随机数明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然

22、后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。#include #include using namespace std;#define Max 1000int main()int ncountMax=0;int n; /随机整数的个数cinn;vector array(n); /声明变长数组for(int i=0;iarrayi;for (int i=0;in;i+)if(arrayi!=0)ncountarrayi=1;for (int i=0;iMax;i+)if (ncounti) coutiendl;return 0; 13.计算字

23、符个数写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写#include using namespace std;int count(char *str,char a)int num=0;if(str!=NULL)while(*str!=0)if(*str=a)num+;str+;return num;int main()char array100,a;gets(array);cina;coutcount(array,a)endl;return 0;14.求最小公倍数正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的

24、正整数值,设计一个算法,求输入A和B的最小公倍数。#include using namespace std;int gdc(int x,int y)return (!y)?x:gdc(y,x%y);int main()int a,b;cina;cinb;cout(a*b)/gdc(a,b)endl;return 0;15.求解立方根计算一个数字的立方根,不使用库函数#include #include#define E 0.0001/精度设置using namespace std;double getCubeRoot(double num) double x0=num; double resul

25、t; while (1) result=x0-(x0*x0*x0-num)/(3*x0*x0); if (result*result*result-num-E) return result; else x0=result; int main()int number;cinnumber;cout fixed showpoint setprecision(1)getCubeRoot(number)endl;16.字符逆序将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。 如:输入“I am a student”,输出“tneduts a ma I”。#include #in

26、clude int ProcessString(char * strInput,char * strOutput)int len=(int) strlen(strInput);char *start = strInput;char *end = strInput + len - 1;char ch;if (strInput != NULL)while (start end)ch = *start;*start+ = *end;*end- = ch;strcpy(strOutput, strInput);return 0;int main()char str100,output100; gets

27、(str); ProcessString(str,output); puts(output);17.记负均正从输入任意个整型数,统计其中的负数个数并求所有非负数的平均值#include #include#include using namespace std;int main()int countfu=0;int count=0;int sum=0;double average=0;vector a;int m;while(cinm)a.push_back(m);int len=a.size();for(int i=0; ilen; i+)if(ai=0)sum+=ai;count+;aver

28、age=double(sum)/count;coutcountfuendl;if(sum=0)cout0.0endl;else if (sum%(count)=0)coutsum/(count)endl;elsecout fixedsetprecision(1)averageendl;18.字符串分割连续输入字符串(输出次数为N,字符串长度小于100),请按长度为8拆分每个字符串后输出到新的字符串数组,#include using namespace std;void CoutString(char a)int len=strlen(a);int flag=0;while(len0) if(l

29、en=8)for(int i=0; ilen; i+)coutai+8*flag;for(int i=len+8*flag; i8+8*flag; i+)cout0;coutendl;break;elsefor(int i=0+8*flag; i8+8*flag; i+)coutai;coutN;char a100100;while (count=N)gets(acount);count+;for (int i=0;i=N;i+)CoutString(ai);return 0;19.字符统计如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。实现以

30、下接口:输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出清空目前的统计结果,重新统计调用者会保证:输入的字符串以0结尾。#include #include using namespace std;struct Countint c;int count;bool cmp(const Count &a,const Count &b)return a.countb.count;int main()struct Count a256;char b200;for(int i=0; i=a&bi=

31、A&bi=0&bi=9 | bi= )char tmp=bi;atmp.count+;sort(a,a+256,cmp);for(int i=0; i256; i+)if(ai.count!=0)coutchar(ai.c);20.输入整型数组和排序标识,对其元素按照升序或降序进行排序输入整型数组和排序标识,对其元素按照升序或降序进行排序#include #include #include using namespace std;bool Comp1(const int &a,const int &b)return ab;bool Comp2(const int &a,const int &b)return aN; /元素个数vector array;for(int i=0; im;/元素大小array.push_back(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论