2014华为机试真题(2) 1.数字是否存在相同部分 2.识别字符串中的整数并转换为数字形式 3.计算字符串 4.身高差值最小 5.确定数字中有某个数字并排序 6.输入整型数组求数组的最小数和最大数之和 7.数组中数字两两相同,有两个不同,找出这两个 8.超过数组长度一半的数字 9.字符串首字母转换成大写

2014华为机试真题(2)
1.数字是否存在相同部分
2.识别字符串中的整数并转换为数字形式
3.计算字符串
4.身高差值最小
5.确定数字中有某个数字并排序
6.输入整型数组求数组的最小数和最大数之和
7.数组中数字两两相同,有两个不同,找出这两个
8.超过数组长度一半的数字
9.字符串首字母转换成大写

        求一个整型数字中有没有相同的部分,例如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!=' '){
		if(flagOpt&&isdigit(*s)&&getNum(s,right)&&(*s==' '||*s==' ')){//当且仅当,获取了运算符的情况下,当前是数字,且数字后紧跟” “或者结束标记位
			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()=='
')
			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!='
'){
		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!='
'){
		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!='
'){
		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;
}