[C/C++]2014年7月华为校招机试真题(一)

第一题(60分):

       按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”

我写的代码如下:

#include <iostream>
#include <vector>
#include <string>
using namespace std;
void cutString(vector<string> &str,unsigned int stringLength);
int main()
{
   int stringCount=0;
  unsigned  int stringLength =0;
   vector<string> str;
	cout<<"请输入两个整数:"<<endl;
    cin>>stringCount>>stringLength;
	cout<<stringCount<<" "<<stringLength<<endl;
	for (int i=0;i<stringCount;++i)
	{
		string s;
		cin>>s;
		str.push_back(s);
	}
	//字符串处理
   cutString(str,stringLength);
   //输出处理后的字符串
	for (vector<string>::iterator iter=str.begin();iter!=str.end();++iter)
	{
		cout<<*iter<<endl;
	}
}
//传的参数是引用,可以避免对对象的拷贝
void cutString(vector<string> &str, unsigned int stringLength)
{
    for (vector<string>::iterator iter=str.begin();iter!=str.end();++iter)   //遍历字符串
	{
		if (iter->size()>stringLength)
		{
			string s;
			int cut_n=iter->size()/stringLength;  //计算要剪切的次数
			for (int k=0; k<cut_n;++k)
			{
				int j=iter->size() -stringLength;
				s.clear();
				for (int i=0;i<j;++i)                   //保存多余的字符串
				{
					s.push_back((*iter)[stringLength+i]);
				}
				iter->erase(stringLength);       //删除从stringLength开始至末尾的所有字符串
				iter=str.insert(iter+1,s);  
			}
			
		}
		if (iter->size()<stringLength)        //字符串长度小于给定长度,补零
		{
			int i=stringLength-iter->size();   //计算要补零的个数
			while (i--)
			{
				iter->push_back('0');
			}
		}
	}
}



还是一道第一题,我另一个同学记得

第一题:拼音转数字

输入是一个只包含拼音的字符串,请输出对应的数字序列。转换关系如下:

描述:      拼音        yi  er  san  si  wu  liu  qi  ba  jiu

      阿拉伯数字        1   2   3      4   5    6    7   8   9

输入字符只包含小写字母,所有字符都可以正好匹配


运行时间限制:无限制

内存限制:       无限制

输入:              一行字符串,长度小于1000

输出:              一行字符(数字)串

样例输入:       yiersansi

样例输出:       1234

我的代码:

#include <iostream>
#include <string>
#include<vector>
using namespace std;

int main()
{
	string s;
	vector<int> number;
	cout<<"请输入一串字符串"<<endl;
	getline(cin,s);
	for(string::size_type i=0;i<s.size();++i)
	{
		switch(s[i])
		{
		case 'y':   //1
			{
				number.push_back(1);
				++i;
			}
			break;
		case 'e':    //2
			{
				number.push_back(2);
				++i;
			}
			break;
		case 's':   //3,4
			{
				if(s[++i]=='i')   //4
				{
					number.push_back(4);
				}
				else
				{
					number.push_back(3);
					++i;  //i已经加过一次,所以只用加一次就行了
				}
			}
			break;
		case 'w':    //5
			{
				number.push_back(5);
				++i;
			}
			break;
		case 'l':    //6
			{
				number.push_back(6);
				i+=2;
			}
			break;
		case 'q':   //7
			{
				number.push_back(7);
				i++;
			}
			break;
		case 'b':   //8
			{
				number.push_back(8);
				i++;
			}
			break;
		case 'j':    //9
			{
				number.push_back(9);
				i+=2;
			}
			break;
		default:
			break;


		}
	}
	cout<<s<<endl;
	//打印
	vector<int>::iterator iter=number.begin();
	while(iter!=number.end())
	{
		cout<<*iter++;
	}
	cout<<endl;
	return 0;
}


 

第二题:去除重复字符并排序

运行时间限制:无限制

内容限制:       无限制

输入:              字符串

输出:              去除重复字符并排序的字符串

样例输入:       aabcdefff

样例输出:       abcdef

我的代码:

#include <iostream>
#include <string>
#include<vector>
#include <algorithm>  //算法
using namespace std;

int main()
{
	string s;
	cout<<"请输入一串字符串"<<endl;
	getline(cin,s);
	//排序
	sort(begin(s),end(s));  //sort 在头文件<algorithm>
	string::iterator iter=s.begin();
    while(iter!=(s.end()-1))  //这里必须是-1,否则下面的iter+1会越界;
	{
		if(*iter==*(iter+1))
		{
			iter=s.erase(iter); //返回被删除元素后一个元素的迭代器
		}
		else
		{
			++iter;
		}
	}
	cout<<s<<endl;
	//打印
	
	return 0;
}



第三题:等式变换

输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。

1 2 3 4 5 6 7 8 9 = X

比如:

12-34+5-67+89 = 5

1+23+4-5+6-7-8-9 = 5

请编写程序,统计满足输入整数的所有整数个数。

输入:       正整数,等式右边的数字

输出:       使该等式成立的个数

样例输入:5

样例输出:23

代码:

可以参考:

http://blog.csdn.net/feifeiyanfeifeia/article/details/38143419

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值