华为2014年机考题

/*输入两个字符串(都是字母)  a到z每个字母有一个权值(1-26) 不区分大小 
写  哪个字母分配哪个权值由你决定  字符串的权值就是字符串中所有字母的权值之和   
现要求自行分配权值 使得两个字符串的权值之差最大  输出最大权值之差(提示:先把 
字符串中的相同字母去掉,再分配权值)*/

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

int MaxWeight(string str1,string str2)
{
	//去掉相同字母后26个字母的对应个数
	int diffString[26]={0};
	int index=0;
	for(int i=0;i<str1.length();i++)
	{
		index=str1[i]-'a';
		++diffString[index];
	}
	for(i=0;i<str2.length();i++)
	{
		index=str2[i]-'a';
		--diffString[index];
	}
	
	/*for(i=0;i<26;i++)
		cout<<diffString[i]<<',';
	cout<<endl;*/

	//对diffString数组进行排序
	int temp;
	for(i=0;i<26;i++)
		for(int j=24;j>=i;j--)
			if(diffString[j+1]<diffString[j])
			{
				temp=diffString[j+1];
				diffString[j+1]=diffString[j];
				diffString[j]=temp;
			}
	
	/*for(i=0;i<26;i++)
		cout<<diffString[i]<<',';
	cout<<endl;*/

	//得到整个数组的总和
	temp=0;
	for(i=0;i<26;i++)
		temp+=diffString[i];
	
	int result=0;
	if(temp<0)//如果和小于0的话,则按26->1的递减方式分配权值
	{
		for(i=0;i<26;++i)
			result+=diffString[i]*(26-i);//计算最大权值,其中(26-i)是分配的权值
	}
	else
	{//否则按照1->26的方式递增分配权值
		for(i=0;i<26;++i)
			result+=diffString[i]*(i+1);//计算最大权值,其中(i+1)是分配的权值
	}
	
	//cout<<abs(result)<<endl;
	return abs(result);//计算结果可能为负,取绝对值
}

int main()
{
	string str1;
	cout<<"input str1:";
	cin>>str1;//="acdafgt";
	string str2;
	cout<<"input str2:";
	cin>>str2;//="abcmxy";

	cout<<"result is:"<<MaxWeight(str1,str2)<<endl;

	return 0;
}
/*
	走廊上有n盏灯  按1到n序号顺序排好  刚开始都是关着的  现有n个人,编号1到n
	编号为1的人从走廊一端走到另一端 把编号是1的倍数的灯开关都动一下(开变关,
	关变开),接着编号是2的人把编号是2的倍数的灯开关都动一下。。。一直到第n个人   
	
	输入:n
	输出:最后还有几盏灯是亮着的
*/
#include<iostream>
#include<vector>
using namespace std;

int StillLighten(int n)
{
	int count=0;//最后亮着的灯的个数int n

	vector<int> lighten(n+1,0);

	//按规则改变灯的状态
	for(int i=1;i<=n;i++)
		for(int j=i;j <= n;j=j+i)
		{
			if(lighten[j]==0)
				lighten[j]=1;
			else
				lighten[j]=0;
		}
	
	//计算最后亮着的灯的个数
	for(i=1;i<=n;i++)
		count+=lighten[i];
	return count;
}

int main()
{
	int n;
	cout<<"number of lights:"<<endl;
	cin>>n;
	cout<<"still lighten:"<<endl;
	cout<<StillLighten(n)<<endl;
	return 0;

}
/*去饭店吃饭 一个男人3元 一个女人2元 一个小孩1元   现输入总人数和总花费    
问有几种不同的组合方式(必须至少有一个男人一个女人一个小孩) */
#include<iostream>
using namespace std;

int CountOfComposition(int moneySum,int numOfPeople)
{
	int numOfMan = 0;//男人数量
	int numOfWoman = 0;//女人数量
	int numOfChild = 0;//小孩数量
	
	int count = 0;//组合方式
	if(moneySum >= 3 * numOfPeople)
		return count;

	for(numOfMan=1;numOfMan<numOfPeople+1;++numOfMan)
		for(numOfWoman=1;numOfWoman<numOfPeople+1;++numOfWoman)
			for(numOfChild=1;numOfChild<numOfPeople+1;++numOfChild)
			{
				if((3*numOfMan+2*numOfWoman+1*numOfChild == moneySum)&&(numOfMan+numOfWoman+numOfChild == numOfPeople))
					++count;
			}
	return count;
}

int main()
{
	int moneySum;
	int numOfPeople;
	cout<<"input moneySum and numOfPeople:"<<endl;
	cin>>moneySum;
	cin>>numOfPeople;

	int count = CountOfComposition(moneySum,numOfPeople);

	cout<<"count of composition is :"<<count<<endl;
	return 0;
}

/*输入一个字符串,判断这个字符串中的括号是否匹配(只针对小括号和中括号),没有 
括号就认为是匹配的。若匹配则输出0,否则输出1.括号必须成对出现,([)]的情况认为是 
不匹配的。 
输入:his name is Jack(a well known person in [Pirates of the Caribbean]) 
输出:0 */
#include<iostream>
#include<stack>
using namespace std;

int IsStringMatch(char *str)
{
	int isMatch = 0;

	if(!str)
		isMatch = -1;
	
	std::stack<char> charStack;
	while(*str != '\0')
	{
		switch(*str)
		{
			//如果是左括号'('或'['则入栈
			case '(':
			case '[':
				charStack.push(*str);
				break;

			//如果是')'且栈首元素不是'('则匹配失败返回1
			case ')':
				{
					if((charStack.top()!='(')||charStack.empty())
						isMatch = 1;
					else
						charStack.pop();
				}
				break;
			
			//如果是']'且栈首元素不是'['则匹配失败返回1
			case ']':
				{
					if((charStack.top()!='[')||charStack.empty())
						isMatch = 1;
					else
						charStack.pop();
				}
				break;
		}
		++str;
	}
	if(!charStack.empty())
		isMatch = 1;

	return isMatch;
}

int main()
{
	char str[] = "his name is Jack(a well known person in ([Pirates of the Caribbean])";
	int n = IsStringMatch(str);
	cout<<"is match?:"<<n<<endl;
	return 0;
}

/*输入五个人的身高,身高值介于160~190之间。找到身高差值最小的两个人,并从小到大 
输出,若出现差值相等的情况,请输出身高较高的那一组。 
输入:176,178,165,180,181 
输出:180,181 */
#include<iostream>
#include<vector>
using namespace std;

//输入满足条件的五个人的身高
vector<int> InputFiveHeight()
{
	int temp;
	vector<int> height;
	while(height.size()<5)
	{
		cin>>temp;
		if((temp>=160)&&(temp<=190))
			height.push_back(temp);
		else
			cout<<"input invalid! please input >=160 and <=190:"<<endl;
	}
	return height;
}

//找到最小差值的身高对并输出最小差值以及身高对
void FindMinDifHeight(const vector<int> &height)
{
	vector<int> twoHeight;
	int size=height.size();
	int min=height[0];
	for(int i=0;i<size;i++)
		for(int j=i+1;j<size;j++)
		{
			int diff=abs(height[i]-height[j]);
			if(min>diff)//找到最小差值,并把身高对放入容器中
			{
				min=diff;
				twoHeight.clear();
				twoHeight.push_back(height[i]);
				twoHeight.push_back(height[j]);
			}
			if(min==diff)
			{
				min=diff;//如果差值相等,则保存更高的那组身高对
				if(((height[i]>twoHeight[0])&&(height[i]>twoHeight[1]))||((height[j]>twoHeight[0])&&(height[j]>twoHeight[1])))
				{//如果新组的其中一个值大于旧组的任何一个,则新组是身高更高的身高对,保存在容器中
					twoHeight.clear();
					twoHeight.push_back(height[i]);
					twoHeight.push_back(height[j]);
				}
			}
		}
	//输出最小差值以及身高更高的身高对
	cout<<"minDiff:"<<min<<endl;
	cout<<"Two Height is:"<<endl;
	vector<int>::iterator iter;
	for(iter=twoHeight.begin();iter!=twoHeight.end();++iter)
		cout<<*iter<<endl;
}

int main()
{
	const vector<int> height = InputFiveHeight();
	FindMinDifHeight(height);

	return 0;
}
/*
	七步之内得到一个回文数字。
	随意输入一个数字,如果不是回文数字,则加上该数的逆转,如此最多七步得到回文数字。
	例如输入:68,不是回文则68+86=154,不是回文则154+451=506,不是回文则506+605=1111是回文,输出1111.
	加逆转不能超过七次。
*/
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;

bool IsHuiWen(string str)//判断字符串是不是回文字符串
{
	int length=str.length();

	for(int i=0;i<length/2;i++)
		if(str[i]!=str[length-i-1])
			return false;
	return true;			
}

string IntToString(int num)//int转换为字符串
{
	string strRet;
	char strTemp[50];
	sprintf(strTemp, "%d", num);
    strRet = strTemp;
	return strRet;
}

int main()
{
	
	int num;
	cin>>num;//输入数字

	string str;
	str=IntToString(num);//将数字转换为字符串

	string strNotRev(str);

	for(int i=0;i<7;i++)//七步之内构造出回文数字
	{
		if(IsHuiWen(str))//如果已经是回文数字,输出该数字,退出程序
		{
			cout<<str<<endl;
			break;
		}
		else//否则加上该数字的逆转
		{
			int tempInt=atoi(strNotRev.c_str());//得到原字符串代表的数
			reverse(str.begin(),str.end());//逆转字符串得到新字符串
			tempInt+=atoi(str.c_str());//加上新字符串代表的数
			str=IntToString(tempInt);//为下一次判断是否为回文数字,先将原字符串和逆转之后的字符串相加的和转换为string类型
			strNotRev =str;//保存此时的新字符串
		}
	}
	return 0;
}

以上代码VC6.0环境下测试通过。


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值