2014年 华为机试题(一)(二)(三)

/**********************************
<p><span style="FONT-SIZE: 14px; FONT-FAMILY: Verdana">请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。</span></p><p>要求实现函数:<span style="FONT-SIZE: 14px; FONT-FAMILY: Verdana">void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);</span></p><p><span style="FONT-SIZE: 14px; FONT-FAMILY: Verdana">【输入】 pInputStr:  输入字符串
            lInputLen:  输入字符串长度         
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;</span></p>
**********************************/
#include<iostream>
using namespace std;
void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr)
{
	try
	{
		if(lInputLen<=0)throw 0;
	    int i=1,count=0;
	    pOutputStr[count]=pInputStr[0];
		int k=0;
		bool flag=false;
	    while(i<lInputLen)
		{
			flag=false;
			for(k=0;k<=count;k++)
			{
				if(pOutputStr[k]==pInputStr[i])
				{
					flag=true;
					break;
				}
			}
			if(!flag)
			{
				count++;
				pOutputStr[count]=pInputStr[i];
			}else flag=false;
			i++;
		}
		count++;
		pOutputStr[count]='\0';
	}catch(int e){
		if(e==0)
		{
			cout<<"正确的字符串的长度大于0!"<<endl;
		}
		exit(0);
	}
}
int main()
{
	//char *pInputStr="aaaaaaaaaa";
    char *pInputStr="afafafafa";
	char *pOutputStr;
	int lInputLen=strlen(pInputStr);
	pOutputStr=new char[lInputLen+1];
	stringFilter(pInputStr,lInputLen,pOutputStr);
	cout<<pInputStr<<endl;
	cout<<pOutputStr<<endl;

	if(pOutputStr!=NULL)delete []pOutputStr;
	return 0;
}

/**********************************
<p><span style="font-size: 14px; font-family: Verdana;"></span></p><p><span style="FONT-SIZE: 14px; FONT-FAMILY: Verdana">请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。</span></p><p><span style="FONT-SIZE: 14px; FONT-FAMILY: Verdana">要求实现函数: 
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);</span></p><p><span style="FONT-SIZE: 14px; FONT-FAMILY: Verdana">【输入】 pInputStr:  输入字符串
            lInputLen:  输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;</span></p><p><span style="font-size: 14px; font-family: Verdana;"></span></p>
**********************************/

#include<iostream>
using namespace std;
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)
{
	try
	{
		if(lInputLen<=0)throw 0;

	    int i=1,count=0;
	    pOutputStr[count]=pInputStr[0];
		int k=1;
		//情况1:只有一个字符组成的字符串;
		if(1==lInputLen)
		{
		   char ch=pOutputStr[count];
           pOutputStr[count]=1+'0';
		   pOutputStr[count+1]=ch;
		   count+=1;
		}
	    while(i<lInputLen)
		{
			if(pOutputStr[count]==pInputStr[i])
			{
				k++;
			}else{
				//情况2:有多个连续字符组成的情况;
				if(k>1)
				{
					char ch=pOutputStr[count];
                    pOutputStr[count]=k+'0';
					pOutputStr[count+1]=ch;
					pOutputStr[count+2]=pInputStr[i];
					count+=2;
				}else{
                    pOutputStr[count+1]=pInputStr[i];
					count+=1;
				}
				k=1;
			}
			//情况3:全部是一样的字符组成的字符串或者最后是以多个连续相同字符结尾组成的字符串;
			if(i==lInputLen-1)
			{
				if(k>1)
				{
					char ch=pOutputStr[count];
                    pOutputStr[count]=k+'0';
					pOutputStr[count+1]=ch;
					count+=1;
				}
			}
			i++;
		}
		count++;
		pOutputStr[count]='\0';
	}catch(int e){
		if(e==0)
		{
			cout<<"正确的字符串的长度大于0!"<<endl;
		}
		exit(0);
	}
}
int main()
{
	//char *pInputStr="a";
    //char *pInputStr="afafafafa";
    //char *pInputStr="afafaaaaa";
    char *pInputStr="cccddecc";
	char *pOutputStr;
	int lInputLen=strlen(pInputStr);
	pOutputStr=new char[lInputLen*2+1];
	stringZip(pInputStr,lInputLen,pOutputStr);
	cout<<pInputStr<<endl;
	cout<<pOutputStr<<endl;
	if(pOutputStr!=NULL)delete []pOutputStr;
	return 0;
}
/**********************************
<p></p><p><span style="font-size: 14px; font-family: Verdana;"></span></p><p><span style="FONT-SIZE: 14px; FONT-FAMILY: Verdana">要求实现函数: 
void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr);</span></p><p><span style="FONT-SIZE: 14px; FONT-FAMILY: Verdana">【输入】 pInputStr:  输入字符串
            lInputLen:  输入字符串长度         
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;</span><span style="FONT-SIZE: 14px; FONT-FAMILY: Verdana"> </span></p><p><span style="FONT-SIZE: 14px; FONT-FAMILY: Verdana">【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出</span></p><p><span style="FONT-SIZE: 14px; FONT-FAMILY: Verdana">示例 
输入:“4 + 7”  输出:“11”
输入:“4 - 7”  输出:“-3”
输入:“9 ++ 7”  输出:“0” 注:格式错误
</span></p><p><span style="font-size: 14px; font-family: Verdana;"></span></p><p></p>
**********************************/

#include<iostream>
#include<math.h>
using namespace std;
void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr)
{
		int i=0;
		int value=0;
		int num_value=0;		
		int flag=-1;//-1开始,0加号,1减号;
		bool flag_exit=false;
	    while(i<lInputLen)
		{
			switch(pInputStr[i])
			{
			case '+':
				{
					if(num_value==0)
					{
						cout<<"输入错误!  ";
						flag_exit=true;
					}else{
						int k;
						int temp=0;
						for(k=0;k<num_value-1;k++)
						{
							int m_value=pInputStr[i-num_value+k]-'0';
							temp=(temp+m_value)*10;
						}
						temp+=pInputStr[i-1]-'0';
						if(flag==-1 || flag==0) value+=temp;
						if(flag==1)value-=temp;
						flag=0;
						num_value=0;
					}
					break;
				}
			case '-':
				{
					if(num_value==0)
					{
						cout<<"输入错误!  ";
						flag_exit=true;
					}else{
						int k=0;
						int temp=0;
						for(k=0;k<num_value-1;k++)
						{
							int m_value=pInputStr[i-num_value+k]-'0';
							temp=(temp+m_value)*10;
						}
						temp+=pInputStr[i-1]-'0';
						if(flag==-1 || flag==0) value+=temp;
						if(flag==1)value-=temp;
						flag=1;
						num_value=0;
					}
					break;
				}
			default:
				{
					num_value++;
					break;
				}
			}
			if(flag_exit)break;
			if(i==lInputLen-1 )
			{
				if(num_value>0)
				{
					int k=0;
					int temp=0;
					for(k=0;k<num_value-1;k++)
					{
					    int m_value=pInputStr[i-1+k]-'0';
						temp=(temp+m_value)*10;
					}
					temp+=pInputStr[i]-'0';
					if(flag==-1 || flag==0) value+=temp;
					if(flag==1)value-=temp;
				}else{
					cout<<"输入错误!  ";
					flag_exit=true;
				}
			}
			i++;
		}

		if(flag_exit)
		{
			pOutputStr[0]='0';
			pOutputStr[1]='\0';
		}else{
			//将value-》0-9之间的数值;
		    //cout<<value<<endl;
			int count=0;
			int j;
			if(value<0)
			{
				pOutputStr[count]='-';
				count++;
				j=1;
			    value=abs(value);
                while(value!=0)
				{
				 pOutputStr[count]=value%10+'0';
				 value/=10;
				 count++;
				}

			for(j=0;j<count/2;j++)
			{
				char ch=pOutputStr[j+1];
				pOutputStr[j+1]=pOutputStr[count-1-j];
				pOutputStr[count-1-j]=ch;
			}
			pOutputStr[count]='\0';
			}else{
                while(value!=0)
				{
				 pOutputStr[count]=value%10+'0';
				 value/=10;
				 count++;
				}
			for(j=0;j<count/2;j++)
			{
				char ch=pOutputStr[j];
				pOutputStr[j]=pOutputStr[count-1-j];
				pOutputStr[count-1-j]=ch;
			}
			pOutputStr[count]='\0';
			}
		}
}
int main()
{
	//char *pInputStr="9+-7";
    //char *pInputStr="-9+7";
    //char *pInputStr="+9+7";
    //char *pInputStr="9++7";
    //char *pInputStr="9+7+";
    char *pInputStr="9-17-8";
	int lInputLen=strlen(pInputStr);
	char *pOutputStr=new char[lInputLen+1];
	cout<<pInputStr<<" = ";
	arithmetic(pInputStr,lInputLen,pOutputStr);
	cout<<pOutputStr<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值