华为机试整理

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;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值