2014华为机试真题(2)
1.数字是否存在相同部分
求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。
函数为 int same(int num)
其中num是输入的整型数字
使用循环移位法。如,每次全扫描匹配一次。至外循环为length-2次。
12345678 12345678 12345678 12345678 12345678 12345678
78123456 67812345 56781234 45678123 34567812 23456781
int same( int num){ int data[100]; int length=0; int count=0; while(num>0) { data[length++]=num%10; num/=10; } if(length<4)//至少四位 return 0; for(int i=2;i<length;i++){//使用循环移位法,最开始移动两位 for(int j=0;j<length-i;j++){ if(data[i+j]==data[j]){ count++; if(count>1) return 1; } else count=0; } for(int j=0;j<i;j++){ if(data[j]==data[length-i+j]){ count++; if(count>1) return 1; } else count=0; } } return 0; }
2.识别字符串中的整数并转换为数字形式
问题描述:
识别输入字符串中所有的整数,统计整数个数并将这些字符串形式的整数转换为数字形式整数。
要求实现函数:
void take_num(const char *strIn, int *n, unsigned int *outArray)
【输入】 strIn: 输入的字符串
【输出】 n: 统计识别出来的整数个数
outArray:识别出来的整数值,其中outArray[0]是输入字符串中从左到右第一个整数,
outArray[1]是第二个整数,以此类推。数组地址已经分配,可以直接使用
【返回】无
注:
I、 不考虑字符串中出现的正负号(+, -),即所有转换结果为非负整数(包括0和正整数)
II、 不考虑转换后整数超出范围情况,即测试用例中可能出现的最大整数不会超过unsigned int可处理的范围
III、 需要考虑 '0' 开始的数字字符串情况,比如 "00035" ,应转换为整数35;
"000" 应转换为整数0;"00.0035" 应转换为整数0和35(忽略小数点:mmm.nnn当成两个数mmm和nnn来识别)
IV、 输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。
示例
输入:strIn = "ab00cd+123fght456-25 3.005fgh"
输出:n = 6
outArray = {0, 123, 456, 25, 3, 5}
int convert(const string& s,int* intArray){ if(s.empty()) return 0; int i=0; bool flag=false; int j=0; while(i<s.length()){ int temp=0; while(isdigit(s[i])){ flag=true; temp=temp*10+s[i]-'0'; i++; } if(flag){ intArray[j++]=temp; temp=0; flag=false; } i++; } return j; } int main() { string s; getline(cin,s); int* intArray=new int[s.length()/2+1]; memset(intArray,0,(s.length()/2+1)*sizeof(0)); int number=convert(s,intArray); for(int i=0;i<number;i++) cout<<intArray[i]<<endl; }
3.计算字符串
通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。
补充说明:
1. 操作数为正整数,不需要考虑计算结果溢出的情况。
2. 若输入算式格式错误,输出结果为“0”。
示例
输入:“4 + 7” 输出:“11”
输入:“4 - 7” 输出:“-3”
输入:“9 ++ 7” 输出:“0” 注:格式错误
#include<iostream> #include<string> using namespace std; /**********************solution1************************************/ bool getNum(const char*& p,int& result){//获得操作数,并返回下一个结果 if(!p||*p<'0'||*p>'9'){ return false; } else{ result=0; while(*p>='0'&&*p<='9'){ result=*p-'0'+10*result; p++; } } return true; } int jisuan(const char* s){ if(!s||!isdigit(*s)) return 0; int left=0,right=0; bool flag=true; bool flagOpt=true; while(*s!='\0'){ if(flagOpt&&isdigit(*s)&&getNum(s,right)&&(*s==' '||*s=='\0')){//当且仅当,获取了运算符的情况下,当前是数字,且数字后紧跟” “或者结束标记位 if(flag) left=left+right; else left=left-right; flagOpt=false;//运算符已经使用,当前设置为未获取 if(*s==' ') s++; } else if(!flagOpt&&*s=='+'&&*(s+1)==' '){//仅仅在运算符未被获取的情况下获取运算符 flag=true;//运算符为”+“ flagOpt=true;//运算符为”+“ s+=2; } else if(!flagOpt&&*s=='-'&&*(s+1)==' '){//仅仅在运算符未被获取的情况下获取运算符 flag=false;//运算符为”+“ flagOpt=true;//运算符为”+“ s+=2; } else return 0; } return left; } void main(){ string s; getline(cin,s); cout<<jisuan(s.c_str())<<endl; }
4.身高差值最小
要从5个人中选取2个人作为礼仪,其中每个人的身高范围为160-190,要求2个人的身高差值最小(如果差值相同的话,选取其中最高的两人),以升序输出两个人的身高。
Smple input:161 189 167 172 188 Sample outPut: 188189
int cmp(const void* a,const void* b){ return *(int*)a- *(int*)b; } template<unsigned int N> int choose(int (&data)[N]){ if(N<=1) return -1; qsort(data,N,sizeof(int),cmp); int index=0; int min=data[1]-data[0]; for(int i=1;i<N-1;i++){ if(data[i+1]-data[i]<=min){ index=i; min=data[i+1]-data[i]; } } return index; } void main(){ int data[]={161,189,167,172,182,173}; int index=choose(data); cout<<data[index]<<" "<<data[index+1]<<endl; }
5.确定数字中有某个数字并排序
输入一行数字:123 423 5645 875 186523
在输入第二行:23
将第一行中含有第二行中“23”的数输出并排序
结果即:123 423 186523
solution:1
#include<iostream> #include<vector> #include <algorithm> #include<string> using namespace std; /**********************solution1************************************/ int compare(const void * arg1, const void *arg2) { return (*(int*)arg1 - *(int*)arg2); } bool decision(int num,const string& key) { char* p=new char[10]; memset(p,0,10); itoa(num,p,10); string s(p); if(s.find(key)!=string::npos) return true; else return false; } void main(){ vector<int> vec; int temp; while(cin>>temp){ vec.push_back(temp); if(cin.get()=='\n') break; } string key; getline(cin,key); for(vector<int>::iterator iter=vec.begin();iter!=vec.end();){ if(!decision(*iter,key)) iter=vec.erase(iter); else iter++; } sort(vec.begin(),vec.end()); for(int i=0;i<vec.size()-1;i++) cout<<vec[i]<<" "; cout<<vec[vec.size()-1]<<endl; }
solution 2:
#include<iostream> #include<vector> #include <algorithm> #include<string> using namespace std; int compare(const void * arg1, const void *arg2) { return (*(int*)arg1 - *(int*)arg2); } vector<int> process(const string& str,const string& key){ string num;//存储读入的数据 vector<int> vec; int i=0; while(i<str.length()){ while(isdigit(str[i])) num.push_back(str[i++]); if(num.find(key)!=string::npos) vec.push_back(atoi(num.c_str()));//调用函数将字符串转换为数字 num.clear(); i++; } sort(vec.begin(),vec.end()); return vec; } void main(){ string key,str; getline(cin,str); getline(cin,key); vector<int> vec=process(str,key); for(int i=0;i<vec.size()-1;i++) cout<<vec[i]<<" "; cout<<vec[vec.size()-1]<<endl; }
重点是sort的使用方式。
6.输入整型数组求数组的最小数和最大数之和
输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,则最小数和最大数都是该数,例如只输入1,则输出为2;另外数组的长度不超过50
int process(){ int temp; cin>>temp; int min,max; min=max=temp; char c=getchar(); while(c!='\n'){ cin>>temp; if(temp>max) max=temp; else if(temp<min) min=temp; c=getchar(); } return min+max; }
7.数组中数字两两相同,有两个不同,找出这两个
#include<iostream> #include<vector> using namespace std; int main() { vector<int> vec; int temp; cin>>temp; char ch=getchar(); while(ch!='\n'){ vec.push_back(temp); cin>>temp; ch=getchar(); } vec.push_back(temp); temp=0; for(int i=0;i<vec.size();i++) temp^=vec[i]; int index=1; while(temp&index==0) index=index<<1; int num1=0,num2=0; for(int i=0;i<vec.size();i++){ if(vec[i]&index) num1^=vec[i]; else num2^=vec[i]; } cout<<num1<<","<<num2<<endl; }
8.超过数组长度一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
#include<iostream> #include<vector> using namespace std; int main() { vector<int> vec; int temp; cin>>temp; char ch=getchar(); while(ch!='\n'){ vec.push_back(temp); cin>>temp; ch=getchar(); } vec.push_back(temp); int i=1,j=1; temp=vec[0]; while(i<vec.size()){ if(vec[i]==temp) j++; else if(j==1) temp=vec[i]; else j--; i++; } cout<<temp<<endl;; }
9.字符串首字母转换成大写
#include<iostream> #include<string> using namespace std; void convert(string& s){ if(s.empty()) return; int i=0; while(i<s.length()){ if(isalpha(s[i])&&(i==0||s[i-1]==' ')) s[i]=toupper(s[i]); i++; } } int main() { string str; getline(cin,str); convert(str); cout<<str<<endl; return 0; }