华为机试练习(一)
一、字符串最后一个单词长度
1、
# -*- coding:utf-8 -*- while True: try: print u'请输入一串字符串' line=raw_input() if len(line)==0: break if len(line)>5000: line=line[:5000] wordlist=line.split() print len(wordlist[-1]) except: break
注意 raw_input()和line.split()的应用
注意break 跳出循环,当不输入和输入错的时候就结束整段程序。
#include<iostream> #include<string> using namespace std; int main() { string s; while(getline(cin,s)) { int n=0,flag=1; for(int i=s.length()-1;i>=0;--i) { if (flag && s[i]==' ')//去除最后的空格,注意设置标记的作用 { continue; } else if(s[i]!=' ') { flag=0; ++n; } else { break; } } cout <<n<<endl; } return 0; }
2、
cin:
用法1:最基本,也是最常用的用法,输入一个数字:
#include<iostream> #include<string> using namespace std; int main() { int a,b; cin>>a>>b; cout<<a+b<<endl; }
用法2:接受一个字符串,遇“空格”、“TAB”、“回车”都结束
#include<iostream> #include<string> using namespace std; int main() { char a[20]; cin>>a; cout<<a<<endl; }
3、cin.get()
cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格
#include<iostream> #include<string> using namespace std; int main() { char a; cin.get(a); cout<<a<<endl; }
#include<iostream> #include<string> using namespace std; int main() { char a; a=cin.get(); cout<<a<<endl; }
两种方法都可以,但是都只接受第一个字符
3.2用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格
#include<iostream> #include<string> using namespace std; int main() { char a[20]; cin.get(a,8); cout<<a<<endl; }
类似于上面,接收了1个'\0'。
4、
4.1 cin.getline() // 接受一个字符串,可以接收空格并输出
#include<iostream> #include<string> using namespace std; int main() { char a[20]; cin.getline(a,8); cout<<a<<endl; }
cin.getline()实际上有三个参数,cin.getline(接受字符串m,接受个数5,结束字符)
#include<iostream> #include<string> using namespace std; int main() { char a[20]; cin.getline(a,8,'5'); cout<<a<<endl; }
#include<iostream> #include<string> using namespace std; int main() { char a[20]; cin.getline(a,8,'9'); cout<<a<<endl; }
选择最靠近的那个条件。cin.getline(a,b,c)其后必须要有参数输入,否则报错。
#include<iostream> #include<string> using namespace std; int main() { char a[3][20]; for(int i=0;i<3;i++) { cout<<"请输入第"<<i+1<<"个字符串:"<<endl; cin.getline(a[i],20); } cout<<endl; for(int j=0;j<3;j++) { cout<<"输出a["<<j+1<<"]的值:"<<a[j]<<endl; } }
数组类型的输入和输出
注意学会格式化的输入和输出。
5、getline() // 接受一个字符串,可以接收空格并输出,需包含“#include”
#include<iostream> #include<string> using namespace std; int main() { string str; getline(cin,str); cout<<str<<endl; }
和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数,注意这个声明的是string ,而非char。
再有,这个将整个行都能输出,而没有‘\0’这种情况。
二、length
#include<iostream> #include<string> using namespace std; int main() { string a; int n; getline(cin,a); n=a.length(); cout<<n<<endl; }
二、
写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。
输入描述:
输入一个有字母和数字以及空格组成的字符串,和一个字符。
输出描述:
输出输入字符串中含有该字符的个数。
1、将想要匹配的字符串分为大小写,按顺序与大写或者小写的匹配
#include<iostream> #include<sstream> using namespace std; int main() { string str; while (getline(cin, str)) { char ch; string str2; getline(cin,str2); ch=str2[0]; //匹配的值 char ch2 = 0; //定义0,是为了空格不输入的情况考虑 if (ch >= 'a'&&ch <= 'z') { ch2 = ch - 32; //如果大写,增加小写的值,如果小写增加大写的值 } if (ch >= 'A'&&ch <= 'Z') { ch2 = ch + 32; } int count = 0; for (int i = 0; i<str.size(); i++) { if (str[i] == ch || str[i] == ch2) { count++; } } cout << count << endl; } return 0; }
#include<iostream> #include<string> using namespace std; int main() { string str; while(getline(cin,str)) { char ch,ch2; cin>>ch; int n=0; if(ch>='a'&&ch<='z') { ch2=ch-32; } else if(ch>='A' && ch<='Z') { ch2=ch+32; } else { ch2=ch; } for(int i=0;i<str.length();i++) { if (str[i]==ch || str[i]==ch2) { n++; } } cout<<n<<endl; } return 0; }
这段程序就实现不了空格字符的个数统计。
2、
#include<iostream> #include<string> using namespace std; int main() { string str; while(getline(cin,str)) { char ch; cin>>ch; char ch2; if(ch>='a'&&ch<='z') { ch2=ch-32; } else if(ch>='A' && ch<='Z') { ch2=ch+32; } else { ch2=ch; } int n=0; for(int i=0;i<str.length();i++) { if (str[i]==ch || str[i]==ch2) { n++; } } cout<<n<<endl; } return 0; }
牛客网的测试不通过,所以以后最好用getline,而别用cin>>给变量赋值。
三、
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
1、
//构建1000个数组,输入选出的数的时候就已经在处理数据 #include <iostream> using namespace std; int main() { int N, n; while (cin >> N) //输入的个数 { int a[1001] = { 0 }; while (N--) { cin >> n;//输入的数组 a[n] = 1;//该编号置1 } for (int i = 0; i < 1001; i++) { if (a[i]) cout << i << endl; } } return 0; }//
2、set容器
#include<iostream> #include<cstring> #include<set> #include<ctime> #define N 999 //三位小数。 using namespace std; int main() { set<int> s; //set容器,从小到大排序,不重复 int i,n,num; while(cin>>n) { s.clear(); //容器清洗 for(i=0; i<n; i++) { cin>>num; s.insert(num);//插入数据 } set<int>::iterator p; for(p=s.begin(); p!=s.end(); p++) { cout<<*p<<endl; } //这样会多输出一个空格 } return 0; }
#include<iostream> #include<set> using namespace std; int main() { int loop ; while (cin >> loop) //看题目,set容器 { int a[1000], tem, i = 0; for (int i = 0; i < loop; i++) { cin >> a[i]; } set<int> num(a, a + loop);//这个什么鬼? for (set<int>::iterator it = num.begin(); it != num.end(); it++) { cout << *it << endl; } } return 0; }
3、插入法排序
#include<iostream> using namespace std; void insert_sort(int a[],int len) //选择法排序 { int i=0,j=0,temp=0,n; for(i=1;i<len;i++) { temp =a[i]; for(j=i-1;j>=0&&temp<a[j];j--) { a[j+1]=a[j]; } a[j+1]=temp; for(n=0;n<len;n++) { cout<<a[n]<<" "; } cout<<endl; } } int main() { int a[]={9,8,7,6,5,4,3,2,1} ; cout<<"初始排序:"<<endl; for(int n=0;n<9;n++) { cout<<a[n]<<" "; } cout<<endl<<endl; insert_sort(a,9); return 0; }
可以看到,就是从第二个数开始,前面的数先排序,然后,将第三个数插入,依次顺序排开。
4、选择排序
#include<iostream> using namespace std; void insert_sort(int a[],int len) //选择法排序 { int i=0,j=0,temp=0,n,smal; for(i=0;i<len-1;i++) { smal=i;//最小值的下标,最小值一直放在这个地方 for(j=i+1;(a[j]<a[smal]&&j<len);j++) { temp=a[smal];//中继容器 a[smal]=a[j]; a[j]=temp; } for(n=0;n<len;n++) { cout<<a[n]<<" "; } cout<<endl; } } int main() { int a[]={9,8,7,6,5,4,3,2,1} ; cout<<"初始排序:"<<endl; for(int n=0;n<9;n++) { cout<<a[n]<<" "; } cout<<endl<<endl; insert_sort(a,9); return 0; }
首先假设第一个是最小值,然后和后面的值一一比较,碰到更小的,交换位置,所以第一个始终都是最小的。继而第二,第三等排下去。
5、冒泡排序
#include<iostream> using namespace std; void insert_sort(int a[],int len) //冒泡排序 { int i=0,j=0,temp=0,n,smal; for(i=0;i<len-1;i++) { for(j=0;j<len-1;j++) { if (a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } for(n=0;n<len;n++) { cout<<a[n]<<" "; } cout<<endl; } } int main() { int a[]={9,8,7,6,5,4,3,2,1} ; cout<<"初始排序:"<<endl; for(int n=0;n<9;n++) { cout<<a[n]<<" "; } cout<<endl<<endl; insert_sort(a,9); return 0; }
从左向右依次两两比较,比较n次后就排好了,但是有个缺点,增加了无效的排序。
6、去重
#include<iostream> #include<string> using namespace std; int deletrepeat(int a[],int n) { cout<<a[0]<<" ";//输出第一个数 int flag=1;//设置标志 int b[n]; b[0]=a[0];//存储去重复后的数组 int index=1;//变化后的下标 for(int i=1;i<n;i++)//循环比较的次数 { for(int j=0;j<index;j++)//j新的数组下标 { if(a[i]==b[j]) { flag=0; } } if(flag==1) { b[index]=a[i]; cout<<b[index]<<" "; index++; } flag=1; } return index; } int main() { int a[]={1,2,3,4,4,5,6,2}; int n=8; deletrepeat(a,n); }
重复的值,下标改变了,需要重新附一个值给下标。
再有,c++,求数组长度的函数没有,length()是求字符串的。
四、
连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
输入描述:
连续输入字符串(输入2次,每个字符串长度小于100)
输出描述:
输出到长度为8的新字符串数组
1、
#include<iostream> #include<string> #include<cmath> using namespace std; void Add_eight(string a,int n) { int x,y; x=(n/8); y=((n/8)+1)*8; for(int j=0;j<x;j++) { for(int k=j*8;k<(j*8+8);k++) { cout<<a[k]; } cout<<endl; } if((n%8)!=0) { for(int m=8*x;m<n;m++) { cout<<a[m]; } for(int q=n;q<8*x+8;q++) { cout<<0; } } //cout<<endl;//用例之间的换行不要在函数中 } int main() { string a,b; getline(cin,a);//输入a,b getline(cin,b); int n1,n2; n1=a.length(); Add_eight(a,n1); cout<<endl;////注意,用例输出在这 n2=b.length(); Add_eight(b,n2); }
注意用例之间的换行位置。
2、
#include<iostream> #include<string> using namespace std; int main() { string a,b,c; a="abcdefg"; b=a.substr(0,3); c=a.substr(0); cout<<b<<endl; cout<<c<<endl; }
3、c++ append用法
(1)向string的后面加C-string
#include<iostream> #include<string> using namespace std; int main() { string s="hello "; const char *c="out here"; s.append(c); cout<<s<<endl; }
(2).向string的后面加C-string的一部分
#include<iostream> #include<string> using namespace std; int main() { string s="hello "; const char *c="out here"; s.append(c,3);//将c的前三个字符连接到s中 cout<<s<<endl; }
(3).向string的后面加string
#include<iostream> #include<string> using namespace std; int main() { string s="hello "; string c="wide "; string q="world"; s.append(c); s=s+q;//字符串可以相加相连 cout<<s<<endl; }
(4)向string的后面加string的一部分
#include<iostream> #include<string> using namespace std; int main() { string s="hello "; string c="wide world"; s.append(c,5,5);//把字符串s2中从5开始的5个字符连接到当前字符串的结尾 cout<<s<<endl; }
#include<iostream> #include<string> using namespace std; int main() { string s="hello "; string c="wide world"; s.append(c.begin()+5,c.end());//把c的迭代器begin()+5和end()之间的部分连接到当前字符串的结尾当前字符串的结尾 cout<<s<<endl; }
(5).向string后面加多个字符
#include<iostream> #include<string> using namespace std; int main() { string s="hello "; s.append(4,'6'); cout<<s<<endl; }
4、
#include <iostream> using namespace std; int main() { string str; while(getline(cin,str)) { while(str.size()>8) { cout << str.substr(0,8) <<endl; str=str.substr(8); } cout << str.append(8-str.size(),'0') << endl; //不够8位的补0 } }
五、
题目描述
写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。
1、它由0-9,A-F组成,字母不区分大小写。
#include <iostream> using namespace std; int main() { int a; while(cin>>hex>>a){ cout<<a<<endl; } }
2、
#include <iostream> #include <iomanip> using namespace std; int main() { int n; cout << "Enter a decimal number: "; cin >> n; cout << n << " in hexadecimal is: " << hex << n << endl //十六进制 << dec << n << " in octal is: " << oct << n << endl //八进制 << setbase( 10 ) << n << " in decimal is: " << n << endl; //十进制 return 0; }
3、输入和输出同时存在的情况
#include<iostream> #include<string> using namespace std; int main() { int n; cin>>hex>>n; cout<<n<<"的十六进制:"<<hex<<n; return 0; }
输入的是个十六进制数,但是保存的n却是十进制,还需要hex才能输出十六进制。
#include<iostream> #include<string> using namespace std; int main() { int n; cin>>oct>>n; cout<<n<<"的十六进制:"<<hex<<n; return 0; }
3、传统一个一个读取的方式
#include<iostream> #include<string> using namespace std; int main() { char *sp=new char[10]; while(cin>>sp) { int n; int num; int result=0; n=strlen(sp); for(int i=2;i<n;i++) { switch(sp[i]) { case 'A': case 'a'://大于10的处理 num=10;break; case 'B': case 'b': num=11;break; case 'C': case 'c': num=12;break; case 'D': case 'd': num=13;break; case 'E': case 'e': num=14;break; case 'F': case 'f': num=15;break; default: if(sp[i]>='0'&&sp[i]<='9') { num=sp[i]-'0'; } } result=result*16+num; } cout<<result<<endl; result=0; } return 0; }
注意case 的情况,只能分开来识别,不能出现case(a||b)这种情况。因为后面给的是逻辑值,只能0或者1。
4、字符串长度求法
C/C++ strlen(str)和str.length()和str.size()都可以求字符串长度。
其中str.length()和str.size()是用于求string类对象的成员函数
strlen(str)是用于求字符数组的长度,其参数是char*。
#include <string> #include <iostream> using namespace std; int main() { string name="babababa"; cout<<name.length()<<endl; cout<<name.size()<<endl; char mail[100]="haha"; cout<<strlen(mail)<<endl; char *psd; psd="lalala"; cout<<strlen(psd)<<endl; return 0; }