华为机试整理
2014-07-14 15:52
281 查看
1.输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;另外数组的长度不超过50。
代码:#include "stdafx.h" #include<iostream> using namespace std; int main(int argc, _TCHAR* argv[]) { int dataLen; int data[50]; cin>>dataLen; for(int i=0;i<dataLen;i++) cin>>data[i]; int max=data[0]; int min=data[0]; for(int i=0;i<dataLen;i++) { if(max<data[i]) max=data[i]; if(min>data[i]) min=data[i]; } cout<<min+max<<endl; }
2.大数相加
用STL的string比较方便,代码如下,自己测了几组数据没有什么问题。
#include "stdafx.h" #include<iostream> #include<string> using namespace std; int main(int argc, _TCHAR* argv[]) { //求两个长长整型的数据的和并输出 string s1,s2; string s3; getline(cin,s1); getline(cin,s2); int len1=s1.length(); int len2=s2.length(); int lenMax=len1>len2?len1:len2; s3.resize(lenMax+1); int temp1,temp2,temp3,temp4=0; int i=len1-1; int j=len2-1; int k=lenMax; while(i>=0||j>=0) { if(i>=0) temp1=s1[i]-'0'; else temp1=0; if(j>=0) temp2=s2[j]-'0'; else temp2=0; temp3=(temp1+temp2+temp4)%10; //本位 temp4=(temp1+temp2+temp4)/10; //进位 s3[k]=temp3+'0'; i--; j--; k--; if(i<0&&j<0) { if(temp4!=0) s3[k]=temp4+'0'; else s3.erase(s3.begin()); break; } } cout<<s3<<endl; }
2.求两个长长整型的数据的和并输出,例如输入1233333333333333 。。。 3111111111111111111111111.。。。,则输出。。。
#include "stdafx.h" #include<iostream> #include<string> using namespace std; int main(int argc, _TCHAR* argv[]) { //求两个长长整型的数据的和并输出 string s1,s2; string s3; getline(cin,s1); getline(cin,s2); int len1=s1.length(); int len2=s2.length(); int lenMax=len1>len2?len1:len2; s3.resize(lenMax+1); int temp1,temp2,temp3,temp4=0; int i=len1-1; int j=len2-1; int k=lenMax; while(i>=0||j>=0) { if(i>=0) temp1=s1[i]-'0'; else temp1=0; if(j>=0) temp2=s2[j]-'0'; else temp2=0; temp3=(temp1+temp2+temp4)%10; //本位 temp4=(temp1+temp2+temp4)/10; //进位 s3[k]=temp3+'0'; i--; j--; k--; if(i<0&&j<0) { if(temp4!=0) s3[k]=temp4+'0'; else s3.erase(s3.begin()); break; } } cout<<s3<<endl; }
3.通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。要求实现函数:
void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
int hash[26];
int main(int argc, _TCHAR* argv[])
{
string s;
string s2;
cin>>s;
int len=s.length();
int i=0;
while(i<len)
{
if(hash[s[i]]==0)
{
hash[s[i]]=1;
s2.push_back(s[i]);
}
else
i++;
}
cout<<s2<<endl;
return 0;
}
4.通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
#include "stdafx.h" #include<iostream> #include<string> using namespace std; int main(int argc, _TCHAR* argv[]) { string s; getline(cin,s); int len=s.length(); string s1; int i=0; int sameNum=1; char sTemp[100]; while(i<len) { sameNum=1; while(i<len-1&&s[i]!=s[i+1]) { s1.push_back(s[i]); i++; } if(i==len-1) { s1.push_back(s[i]); break; } while(s[i]==s[i+1]&&i<len-1) { sameNum++; i++; } itoa(sameNum,sTemp,10); s1.append(sTemp); s1.push_back(s[i]); i++; } cout<<s1<<endl; return 0; }
5.通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。补充说明:
1. 操作数为正整数,不需要考虑计算结果溢出的情况。
2. 若输入算式格式错误,输出结果为“0”。
#include "stdafx.h" #include<iostream> #include<string> using namespace std; int main(int argc, _TCHAR* argv[]) { string s; getline(cin,s); int pos1=s.find(" "); int pos2=s.find(" ",pos1+1); if(pos1==s.npos||pos2==s.npos) { cout<<0<<endl; return 0; } string sNum1=s.substr(0,pos1); string sNum2=s.substr(pos2+1); string sOper=s.substr(pos1+1,1); if(sOper!="+"&&sOper!="-") { cout<<0<<endl; return 0; } int num1=atoi(sNum1.c_str()); int num2=atoi(sNum2.c_str()); if(sOper=="+") cout<<num1+num2<<endl; if(sOper=="-") cout<<num1-num2<<endl; return 0; }
7..输入一串字符,只包含“0-10”和“,”找出其中最小的数字和最大的数字(可能不止一个),输出最后剩余数字个数。如 输入 “3,3,4,5,6,7,7”
#include "stdafx.h" #include<iostream> #include<sstream> #include<string> #include<algorithm> #include<vector> using namespace std; int main(int argc, _TCHAR* argv[]) { string s; cin>>s; int len=s.length(); for(int i=0;i<len;i++) if(s[i]==',') s[i]=' '; stringstream strm(s); vector<string> sv; string temp; while(strm>>temp) sv.push_back(temp); vector<int> si; for(vector<string>::iterator iter=sv.begin();iter!=sv.end();iter++) si.push_back(atoi((*iter).c_str())); int min=si[0]; int max=min; for(int i=0;i<si.size();i++) { if(min>si[i]) min=si[i]; if(max<si[i]) max=si[i]; } cout<<min<<' '<<max<<endl; for(int i=0;i<si.size();i++) if(si[i]!=min&&si[i]!=max) cout<<si[i]<<' '; cout<<endl; return 0; }
9. 删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。
#include "stdafx.h" #include<iostream> #include<string> using namespace std; int main(int argc, _TCHAR* argv[]) { char s[100],subS[100]; char sOut[100]; cin.getline(s,100); cin.getline(subS,100); int len=strlen(s); int subLen=strlen(subS); int i=0,j=0; int k=0; int count=0; while(i<len) { while(j<subLen&&s[i+j]==subS[j]) j++; if(j==subLen) //匹配成功 { i=i+j; count++; } else { sOut[k++]=s[i++]; } j=0; } sOut[k]='\0'; cout<<sOut<<endl; cout<<count<<endl; return 0; }
12. 描述:一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。
有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。注:电灯数和学生数一致。输入:电灯的数量
输出:亮着的电灯数量
样例输入:3
样例输出:1
#include "stdafx.h"
#include<iostream>
using namespace std;
int lamp[65536];
int main(int argc, _TCHAR* argv[])
{
int n;
cin>>n;
//方法,常规方法
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(j%i==0)
{
if(lamp[j]==1)
lamp[j]=0;
else
lamp[j]=1;
}
}
}
int count=0;
for(int i=1;i<=n;i++)
if(lamp[i]==1)
count++;
cout<<count<<endl;
/*方法2 热头同学想到的很高明的方法,只有灯的编号有奇数个因子的时候才会亮,
因子个数为奇数的数必然是某个数的平方,这种思路的代码很简单。
*/
count=0;
for(int i=1;i*i<=n;i++)
{
count++;
}
cout<<count<<endl;
return 0;
}
14. 字串转换
问题描述:将输入的字符串(字符串仅包含小写字母‘a’到‘z’),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次。例如:aa 转换为 bc,zz 转换为 ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算。
#include "stdafx.h" #include<iostream> #include<string> using namespace std; int main(int argc, _TCHAR* argv[]) { string s; cin>>s; int flag=0; int len=s.length(); char reg=s[0]; //保存i-1改变之前的值 s[0]='a'+(s[0]-'a'+1)%26; for(int i=1;i<len;i++) { if(s[i]==reg) { reg=s[i]; if(flag==0) { s[i]='a'+(s[i]-'a'+2)%26; flag=1; } else { s[i]='a'+(s[i]-'a'+1)%26; flag=0; } } else { flag=0; reg=s[i]; s[i]='a'+(s[i]-'a'+1)%26; } } cout<<s<<endl; }
19. 链表相邻元素翻转,如a->b->c->d->e->f-g,翻转后变为:b->a->d->c->f->e->g
#include "stdafx.h" #include<iostream> #include<algorithm> #include<string> using namespace std; /* 链表相邻元素翻转,如a->b->c->d->e->f-g,翻转后变为:b->a->d->c->f->e->g */ struct ListNode { int data; ListNode* next; }; void printList(ListNode* head) { if(head==NULL) return; ListNode *p=head->next; while(p!=NULL) { cout<<p->data<<' '; p=p->next; } cout<<endl; } void deleteList(ListNode* head) { if(head==NULL) return; ListNode *q; ListNode *p=head; while(p!=NULL) { q=p->next; delete p; p=q; } } int main(int argc, _TCHAR* argv[]) { ListNode* head=new ListNode; ListNode* p,*q; const int n=11; q=head; for(int i=0;i<n;i++) { p=new ListNode; p->data=i; q->next=p; q=p; } p->next=NULL; //print original list printList(head); //相邻元素交换 p=head; while(p->next!=NULL&&p->next->next!=NULL) { q=p->next; //交换 p->next=q->next; q->next=p->next->next; p->next->next=q; p=p->next->next; } printList(head); deleteList(head); return 0; }
20. 输入一串字符串,其中有普通的字符与括号组成(包括‘(’、‘)’、‘[’,']'),要求验证括号是否匹配,如果匹配则输出0、否则输出1.
#include "stdafx.h" #include<iostream> #include<string> #include<stack> using namespace std; int main(int argc, _TCHAR* argv[]) { string s; stack<char> st; cin>>s; int len=s.length(); int flag=0; for(int i=0;i<len;i++) { switch(s[i]) { case('('): case('['): st.push(s[i]); break; case(')'): if(st.empty()) flag=1; //栈空,个数不匹配 else if(st.top()!='(') //顺序不对 { flag=1; } else st.pop(); break; case(']'): if(st.empty()) flag=1; else if(st.top()!='[') { flag=1; } else st.pop(); break; } } if(flag==0&&st.empty()) cout<<1<<endl; else cout<<0<<endl; return 0; }
24.将整数倒序输出,剔除重复数据
输入一个整数,如12336544,或1750,然后从最后一位开始倒过来输出,最后如果是0,则不输出,输出的数字是不带重复数字的,所以上面的输出是456321和571。如果是负数,比如输入-175,输出-571。#include "stdafx.h" #include<iostream> #include<algorithm> #include<string> using namespace std; //将整数倒序输出,剔除重复数据 int main(int argc, _TCHAR* argv[]) { char s[100]; cin>>s; int len=strlen(s); reverse(s,s+len); int i=0; while(s[i]=='0'&&i<len) i++; if(i==len) return 0; int j=0,k=i; while(k<len-1) { if(s[k]!=s[k+1]) s[j++]=s[k++]; else k++; } if(s[len-1]=='-') { s[j]='\0'; cout<<'-'; } else { s[j++]=s[len-1]; s[j]='\0'; } cout<<s<<endl; return 0; }
27.统计数字出现的次数,最大次数的统计出来
举例:输入:323324423343
输出:3,6
#include "stdafx.h" #include<iostream> #include<string> using namespace std; /* 27.统计数字出现的次数,最大次数的统计出来 举例: 输入:323324423343 输出:3,6 */ int main(int argc, _TCHAR* argv[]) { string s; int hash[10]; cin>>s; memset(hash,0,sizeof(hash)); int len=s.length(); int i=0; while(i<len) hash[s[i++]-'0']++; int max=0; for(int i=0;i<10;i++) if(max<hash[i]) max=hash[i]; for(i=0;i<10;i++) if(max==hash[i]) { cout<<i; i++; break; } for(;i<10;i++) if(max==hash[i]) cout<<','<<i; cout<<endl; return 0; }
28.字符串首字母转换成大写
题目描述请编写一个main函数,它的功能是:将字符串中的所有单词的首字母改为大写,字符串中以空格分割各个单词,其他字符不变。
输入
一个字符串。
输出
所有单词的首字母改为大写的字符串。
样例输入
this is a Dog.
样例输出
This Is A Dog.
#include "stdafx.h" #include<iostream> #include<string> using namespace std; /* 28.字符串首字母转换成大写 题目描述 请编写一个main函数,它的功能是:将字符串中的所有单词的首字母改为大写,字符串中以空格分割各个单词,其他字符不变。 输入 一个字符串。 输出 所有单词的首字母改为大写的字符串。 样例输入 this is a Dog. 样例输出 This Is A Dog. */ int main(int argc, _TCHAR* argv[]) { string s; getline(cin,s); bool isSpace=true; int len=s.length(); for(int i=0;i<len;i++) { if(isSpace&&s[i]!=' ') { s[i]=toupper(s[i]); isSpace=false; } if(s[i]==' ') isSpace=true; } cout<<s<<endl; return 0; }
29. 子串分离
题目描述:通过键盘输入任意一个字符串序列,字符串可能包含多个子串,子串以空格分隔。请编写一
个程序,自动分离出各个子串,并使用’,’将其分隔,并且在最后也补充一个’,’并将子
串存储。
如果输入“abc def gh i d”,结果将是abc,def,gh,i,d,
#include "stdafx.h" #include<iostream> #include<string> #include<vector> using namespace std; int main(int argc, _TCHAR* argv[]) { string s; getline(cin,s); vector<string> vs; string temp; int len=s.length(); bool isSpace=true; for(int i=0;i<len;i++) { if(isSpace==true&&s[i]!=' ') { isSpace=false; if(!temp.empty()) vs.push_back(temp); temp.clear(); } if(s[i]!=' ') temp.push_back(s[i]); if(s[i]==' ') isSpace=true; } if(!temp.empty()) vs.push_back(temp); for(vector<string>::iterator iter=vs.begin();iter!=vs.end();iter++) cout<<*iter<<','; cout<<endl; return 0; }或者使用stringstream
#include "stdafx.h" #include<iostream> #include<string> #include<sstream> #include<vector> using namespace std; int main(int argc, _TCHAR* argv[]) { string s; getline(cin,s); stringstream sstr(s); vector<string> vs; string temp; while(sstr>>temp) vs.push_back(temp); for(vector<string>::iterator iter=vs.begin();iter!=vs.end();iter++) cout<<*iter<<','; cout<<endl; return 0; }
相关文章推荐
- 华为招聘机试整理5:简单四则运算
- 华为招聘机试整理2:判断一个数组的元素是否是回文
- 华为招聘机试整理6:选秀节目打分
- 华为招聘机试整理3:数组比较
- 华为招聘机试整理14:数组奇数偶数排序
- 华为招聘机试整理4:手机号码合法性判断
- 华为招聘机试整理8:操作系统任务调度问题
- 华为招聘机试整理14:数组奇数偶数排序
- 华为机试整理[2014年8月15日上午机试准备]
- 华为招聘机试整理1:删除子串
- 华为机试—围棋吃子(下围棋)判决(高级题160分:深度优先遍历)(图文吐血整理)
- 华为招聘机试整理9:输入一个字符串,用指针求出字符串的长度
- 华为招聘机试整理10:实现字符串中子字符串的替换
- 华为招聘机试整理10:实现字符串中子字符串的替换
- 华为招聘机试整理5:简单四则运算
- 华为招聘机试整理11:实现字符串间隔输出
- 牛客网_华为机试_034_图片整理(字符排序)
- 华为招聘机试整理11:实现字符串间隔输出
- 华为招聘机试整理15:约瑟夫环
- 华为招聘机试整理9:输入一个字符串,用指针求出字符串的长度