zoukankan      html  css  js  c++  java
  • 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!=''){
    		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;
    }









  • 相关阅读:
    Hibernate的查询方式汇总
    JdbcTemplate详解
    spring读取数据库的配置信息(url、username、password)时的<bean>PropertyPlaceholderConfigurer的用法
    spring aop方式配置事务中的三个概念 pointcut advice advisor
    spring mvc静态资源请求和<mvc:annotation-driven>
    spring aop实现原理
    Spring 配置 事务的几种方式
    转!!常用的4种动态网页技术—CGI、ASP、JSP、PHP
    转! java 中“==” 与“ .equals ”比较
    mysql 批处理文件--- 创建 用户 以及 导入数据
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5392988.html
Copyright © 2011-2022 走看看