华为机试题

参考来源: Trony的博客  http://www.cnblogs.com/Trony/archive/2012/10/01/2709959.html

                  lanyan822博客http://blog.csdn.net/lanyan822/article/details/7983832

1.选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type[i] == 1,表示专家评委,judge_type[i] == 2,表示大众评委,n表示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分 * 0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委,则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。

函数接口 int cal_score(int score[], int judge_type[], int n)

<pre name="code" class="cpp">#include "stdafx.h"
#include <iostream>

using namespace std;

int cal_score(int score[], int judge_type[], int n);
int cal_score1(int score[], int judge_type[], int n);

int _tmain(int argc, _TCHAR* argv[])
{
	int Score[4]={5,3,4,3};
	int Type[4]={1,1,2,2};
	cout<<cal_score(Score,Type,4)<<endl;
	system("pause");
	return 0;
}

int cal_score(int score[], int judge_type[], int n)
{
	int iExpertScore=0,iExpertNum=0;
	int iPeopleScore=0,iPeopleNum=0;
	float fExpertAverage=0.0;
	float fPeopleAverage=0.0;
	int  iResult=0;
	//处理边界条件
	if((score==NULL)||(judge_type==NULL)||(n<=0))
	{
		return 0;
	}
	for(int i=0; i<n;i++)
	{
		if(judge_type[i]==1)//专家评委
		{
			iExpertScore+=score[i];
			iExpertNum+=1;
		}
		else if(judge_type[i]==2)//大众评委
		{
			iPeopleScore+=score[i];
			iPeopleNum+=1;
		}
	}
	
	if(iPeopleNum==0)//如果没有大众评委
	{
		fExpertAverage=iExpertScore/(float)iExpertNum;
		iResult=(int)(fExpertAverage*10+5);
		iResult=iResult/10;
	}
	else
	{
		fExpertAverage=iExpertScore/(float)iExpertNum;
		fPeopleAverage=iPeopleScore/(float)iPeopleNum;
		float t=(0.6*fExpertAverage+0.4*fPeopleAverage);
		iResult=t*10+5;
		iResult=iResult/10;
	}
	
	return iResult;
}


 
 

2.给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。

例如:input[] = {3, 6, 1, 9, 7} output[] = {3, 7, 9, 6, 1}; input[] = {3, 6, 1, 9, 7, 8} output[] = {1, 6, 8, 9, 7, 3}

函数接口 void sort(int input[], int n, int output[])

#include "stdafx.h"
#include<iostream>

using namespace std;
void sort(int input[], int n, int output[]);

int _tmain(int argc, _TCHAR* argv[])
{

	int input[] = {3, 6, 1, 9, 7,8};
	int output[] = {3, 7, 9, 6, 1,8};
	int m=sizeof(input)/sizeof(int);

	sort(input,m,output);
	for(int i=0;i<m;i++)
	{
		cout<<output[i]<<"  ";
	}

	system("pause");
	return 0;
}

void sort(int input[], int n, int output[])
{
	int temp=0;
	bool Change=false;

	//边界条件
	if((input==NULL)||(output==NULL)||(n<=0))
		return;

	//排序 由小到大
	for(int i=0;i<n;i++)
	{
		Change=false;
		for(int j=n-1;j>=i;j--)
		{
			if(input[j]<input[j-1])
			{
				Change=true;
				temp=input[j];
				input[j]=input[j-1];
				input[j-1]=temp;
			}
		}
		if(!Change)
			break;
	}
	
	int center=n/2;
	output[center]=input[n-1];
	int k=n-2;
	int offset=1;
	while(k>=0)
	{
	    output[center-offset]=input[k--];
		if(k<0)
		{
			break;
		}
		 output[center+offset]=input[k--];
		 offset++;
	}

}

3.

操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越 高。函数scheduler实现如下功能,将task[] 中的任务按照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中(数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在前面,数组元素为-1表示结束。

例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99} system_task[] = {0, 3, 1, 7, -1} user_task[] = {4, 8, 2, 6, -1}

函数接口 void scheduler(int task[], int n, int system_task[], int user_task[])

#include "stdafx.h"
#include <iostream>
using namespace std;

void scheduler(int task[], int n, int system_task[], int user_task[]);
void Swap(int* a,int* b);


int _tmain(int argc, _TCHAR* argv[])
{
	int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99} ;
	int system_task[5] = {0};
	int user_task[5] = {0};
	int m=sizeof(task)/sizeof(int);
	scheduler(task,m,system_task,user_task);

	
	for(int i=0;i<5;i++)
	{
		cout<<system_task[i]<<"  ";
	}
	cout<<endl;

	for(int i=0;i<5;i++)
	{
		cout<<user_task[i]<<"  ";
	}

	system("pause");
	return 0;
}


void scheduler(int task[], int n, int system_task[], int user_task[])
{
	//处理边界问题
	if((task==NULL)||(n<=0)||(system_task==NULL)||(user_task==NULL))
	{
		return ;
	}

	int iSystemTaskNum=0;
	int iUserTaskNum=0;

	for(int i=0;i<n;i++)
	{
		if((task[i]>=0)&&(task[i]<50)) //系统任务
		{
			system_task[iSystemTaskNum++]=i;
		}
		else if((task[i]>=50)&&(task[i]<=250)) //用户任务
		{
			user_task[iUserTaskNum++]=i;
		}
		else //非法任务
		{

		}

	}

		int temp;
	//按优先级由高到低排序
	for(int i=0;i<iSystemTaskNum;i++)
	{
		int min=task[system_task[i]];
		int index=i;

		for(int j=iSystemTaskNum-1;j>=i;j--)
		{
			if(task[system_task[j]]<min)
			{
				min=task[system_task[j]];
				index=j;
			}
		}
		if(i!=index)
		{

			Swap(&system_task[i],&system_task[index]);
		}
        
	}

	for(int i=0;i<iUserTaskNum;i++)
	{
		int min=task[user_task[i]];
		int index=i;

		for(int j=iUserTaskNum-1;j>=i;j--)
		{
			if(task[user_task[j]]<min)
			{
				min=task[user_task[j]];
				index=j;
			}
		}
		if(i!=index)
		{

			Swap(&user_task[i],&user_task[index]);
		}
        
	}

	system_task[iSystemTaskNum]=-1;
	user_task[iUserTaskNum]=-1;
}

void Swap(int* a,int* b)
{
	int tp;
	tp=*a;
	*a=*b;
	*b=tp;
}

4.

比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较中发现的不相等元素的个数

比如:

数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0

数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3

要求实现函数:

int array_compare(int len1, int array1[], int len2, int array2[])

#include "stdafx.h"
#include <iostream>
#include <assert.h>

using namespace std;

int array_compare(int len1, int array1[], int len2, int array2[]);

int _tmain(int argc, _TCHAR* argv[])
{
	int array1[] = {1,3,5};
	int len1 = 3;
	int array2[] = {77,21,1,3,5,7};
	int len2 = 6;
	cout<<array_compare(len1,array1,len2,array2)<<endl;

	system("pause");
	return 0;
}

int array_compare(int len1, int array1[], int len2, int array2[])
{
	//边界
	if((len1<=0)||(array1==NULL)||(len2<=0)||(array2==NULL))
	{
	  return -1;
	}
	int iNum=0;
	int n;
	if(len1<len2)
	{
		n=len1-1;
		while(n>=0)
		{
			if(array1[n]!=array2[len2-len1+n])
			{
				iNum++;
			}
			n--;
		}
	}
	else
	{
		n=len2-1;
		while(n>=0)
		{
			if(array1[len1-len2+n]!=array2[n])
			{
				iNum++;
			}
			n--;
		}
	}
	return iNum;
}

5.约瑟夫问题: 输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替 换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程 实现上述计数过程,同时输出数值出列的顺序

比如:输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置)

第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数

第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数

第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数

最后一轮计数出列数字为4,计数过程完成。

输出数值出列顺序为:2,3,1,4。

#include "stdafx.h"
#include <iostream>

using namespace std;

void array_iterate(int len, int input_array[], int m, int output_array[]);
int _tmain(int argc, _TCHAR* argv[])
{
	int input_array[] = {3,1,2,4};
	int len = 4;
	int m=7;
    int output_array[4] = {-1};
	array_iterate(len,input_array,m,output_array);
	
	
	for(int i=0;i<len;i++)
	{
		cout<<output_array[i]<<" ";
	}
	system("pause");
	return 0;
}

void array_iterate(int len, int input_array[], int m, int output_array[])
{
	//边界条件
	if((len<=0)||(input_array==NULL)||(m<=0)||(output_array==NULL))
	{
		return;
	}

	int n=len;
	int pos=0;//计数起点位置序号
	int i=0;
	while(n>1)
	{
		int tp=pos+m%n;
		if(tp>n-1) //偏移后序号超过数组大小
		{
			pos=tp%n-1;
		}
		else
		{
			pos=tp-1;
		}
		m=input_array[pos];
		output_array[i++]=input_array[pos];
		for(int j=pos;j<n-1;j++)
		{
			input_array[j]=input_array[j+1];
		}
		n--;
	}
	output_array[i++]=input_array[0];
}


6.简单四则运算

问题描述:输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值

注:

3.1、表达式只含 +, -, *, / 四则运算符,不含括号

3.2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况

3.3、要考虑加减乘除按通常四则运算规定的计算优先级

3.4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生

3.5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况

要求实现函数:int calculate(int len, char *expStr)

示例:

1)输入:char *expStr = “1+4*5-8/3”

函数返回:19

#include "stdafx.h"
#include <iostream>
#include <ctype.h>
using namespace std;



int calculate(int len, char *expStr);
int _tmain(int argc, _TCHAR* argv[])
{

	char *expStr = "1+4*5-8/3";
	char *expStr1 = "8/3*3";
	cout<<calculate(5,expStr1)<<endl;
	system("pause");
	return 0;
}

int calculate(int len, char *expStr)
{
	int iOperateNum=0;
	int iNumberNum=0;

	for(int i=0;i<len;i++)
	{
		if(isdigit(expStr[i]))
		{
			iNumberNum++;
		}
		else
		{
			iOperateNum++;
		}
	}
	char* OperateSign=new char[iOperateNum-1]; //+ -栈
	int*  Number=new int[iNumberNum-1];//操作数
	iNumberNum=0;
	iOperateNum=0;
	
	//相当于入栈
	for(int i=0;i<len;i++)
	{
		if(isdigit(expStr[i]))
		{
			Number[iNumberNum++]=expStr[i]-'0';
		}
		else if((expStr[i]=='+')||(expStr[i]=='-'))
		{
			OperateSign[iOperateNum++]=expStr[i];
		}
		else if(expStr[i]=='*')
		{
			Number[iNumberNum-1]*=expStr[i+1]-'0';
			i++; //跳过*号后面的数字
		}
		else if(expStr[i]=='/')
		{
				int m=expStr[i+1]-'0';
				if(m!=0) //被除数不为0
				{
					Number[iNumberNum-1]/=m;
			        i++; //跳过*号后面的数字
				}
				else
				{
					return -1;
				}
		}
	}
	
	iNumberNum--;
	iOperateNum--;

	for(int i=iOperateNum;i>=0;i--)
	{
		if(OperateSign[i]=='+')
		{
			iNumberNum--;
			Number[iNumberNum]+=Number[iNumberNum+1];
		}
		else if(OperateSign[i]=='-')
		{
			iNumberNum--;
			Number[iNumberNum]-=Number[iNumberNum+1];
		}
	}
	return Number[0];
}

7.

 识别字符串中的整数并转换为数字形式(40分)

问题描述: 
识别输入字符串中所有的整数,统计整数个数并将这些字符串形式的整数转换为数字形式整数。

要求实现函数: 

void take_num(const char *strIn, int *n, unsigned int *outArray)

示例 
输入:strIn = "ab00cd+123fght456-25  3.005fgh"

输出:n = 6

#include "stdafx.h"
#include <iostream>
#include <ctype.h>
#include <math.h>

using namespace std;

#define Max 100
bool isExist(int a,unsigned int *outArray);
void take_num(const char *strIn, int *n, unsigned int *outArray);

int _tmain(int argc, _TCHAR* argv[])
{

	char* strIn = "ab00cd+123fght456-25  3.005fgh";
	unsigned int* outArray = new unsigned int[Max];
	int m=-1;
	take_num(strIn,&m,outArray);
	cout<<m<<endl;
	for(int i=0;i<m;i++)
	{
		cout<<outArray[i]<<" ";
	}

	system("pause");
	return 0;
}

void take_num(const char *strIn, int *n, unsigned int *outArray)
{
	
	int Len =strlen(strIn);
	int iNum=0;
	int* Number=new int[Max];
	int iOut=0;
	for(int i=0;i<Len;i++)
	{
		if(isdigit(strIn[i])) //如果是数字
		{
			Number[iNum++]=strIn[i]-'0';
		}
		else
		{
			if(iNum!=0) //如果有数字
			{
			     int temp=0;

				 for(int j=0;j<iNum;j++)
				 {
					 temp+=Number[j]*(int)pow(10.0,iNum-j-1);
				 }

				 //查重
				if(isExist(temp,outArray))
				{

				}
				else
				{
					outArray[iOut++]=temp;
				}
				iNum=0;
			}
		}
	}

	*n=iOut;


}

bool isExist(int a,unsigned int *outArray)
{
	if(outArray==NULL)
	{
		return false;
	}
    int n=_msize(outArray)/sizeof(outArray);///就能得到数组元素个数
	for(int i=0;i<n;i++)
	{
		if(outArray[i]==a)
		{
			return true;
		}
	}
	return false;
	
}

8.  问题描述:
将输入的字符串(字符串仅包含小写字母‘a’到‘z’),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次。例如:aa 转换为 bc,zz 转换为 ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算。
要求实现函数:
void convert(char *input,char* output)
【输入】  char *input , 输入的字符串
【输出】  char *output ,输出的字符串
【返回】 无
#include "stdafx.h"
#include <iostream>

using namespace std;
void convert(char *input,char* output);
int _tmain(int argc, _TCHAR* argv[])
{
	char* input="abbbcd" ;
    char* output=new char[strlen(input)];

	convert(input,output);

	for(int i=0;i<strlen(input);i++)
	{
		cout<<output[i]<<" ";
	}
	system("pause");
	return 0;
}


void convert(char *input,char* output)
{
	//边界处理
	if((input==NULL)||(output==NULL))
	{
		return;
	}
	int Len=strlen(input);
	char Pre[2]={'\0','\0'}; //Pre[0] 上上次字符  Pre[1]上次字符
	for(int i=0;i<Len;i++)
	{
	    if(input[i]!=Pre[1]) //当前字符不等于上次字符
		{
			output[i]=(input[i]-'a'+1)%26+'a';
			Pre[0]=Pre[1];
			Pre[1]=input[i];
		}
		else  //连续2个字符一样
		{
			 if(input[i]!=Pre[0]) //如果当前字符等于上上次字符  连续3个字符一样
			 {
				 	output[i]=(input[i]-'a'+2)%26+'a';
					Pre[0]=Pre[1];
					Pre[1]=input[i];
			 }
			 else
			 {
				 	output[i]=(input[i]-'a'+1)%26+'a';
			        Pre[0]=Pre[1];
			        Pre[1]=input[i];
			 }

		}

	}

}

9. 问题描述:    
在给定字符串中找出单词( “单词”由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,如空格、问号、数字等等;另外单个字母不算单词);找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中;如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。
要求实现函数:
void my_word(charinput[], char output[])
【输入】  char input[], 输入的字符串
【输出】  char output[],输出的字符串
【返回】 无
示例
输入:charinput[]="some local buses, some1234123drivers" ,
输出:charoutput[]="drivers local buses some"
输入:charinput[]="%A^123 t 3453i*()" ,

输出:charoutput[]=""

#include "stdafx.h"
#include <iostream>
#include <string.h>

using namespace std;
#define WordMaxLen 100 //设单词最大长度为100
#define Max 20
void my_word(char input[], char output[]);
bool IsExist(char P[][Max],int n);
void StringConnect(char* dest,char source);
void SwapPointer(char *p,char* q);

int _tmain(int argc, _TCHAR* argv[])
{
	char input[]="some local buses, some1234123drivers" ;
	//char input[]="%A^123 t 3453i*()" ;
    char output[WordMaxLen]="";
     my_word(input,output);
	 cout<<output<<endl;
	system("pause");
	return 0;
}

void my_word(char input[], char output[])
{
	
	if(input==NULL||output==NULL)
	{
		return;
	}
   
	
	char P[WordMaxLen][Max]={""};   //存储单词数组 
	for(int i=0;i<WordMaxLen;i++)
	{
	    for (int j=0;j<Max;j++)
		{
			P[i][j]='\0';
		}
	}
	int OutNum=0;
	int Length=strlen(input);

	
	
	for(int i=0;i<Length;i++)
	{
		if(((input[i]>='a')&&(input[i]<='z'))||((input[i]>='A')&&(input[i]<='Z'))) //如果当前字符为字母
		{
			StringConnect(P[OutNum],input[i]);
		}
		else
		{
			int nn=strlen(P[OutNum]);
			if(nn>1) //如果Word[]有字母,且字母数大于1 则算一个单词,否则不算
			{
				//查重
				if(IsExist(P,OutNum))
				{
				   for(int k=0;k<Max;k++)
				   {
					   P[OutNum][k]='\0';
				   }
				}
				else
				{
				  OutNum++;
				}
			}
			else
			{
				 for(int k=0;k<Max;k++)
				   {
					   P[OutNum][k]='\0';
				   }
			}

		}

	}

	//按单词长度进行排列
	int n=0;
	int OutLen=0; //总字符长度

	while(1)
	{
		if(strlen(P[n])>0)
		{
		OutLen+=strlen(P[n]);
		 n++;
		}
		else
		{
			break;
		}
	}
	
	char *tp=NULL;
	for(int i=1;i<n;i++)
	{
		for(int j=n-1;j>=i;j--)
		{
			if(strlen(P[j])>strlen(P[j-1]))
			{
				SwapPointer(P[j],P[j-1]);
			}
		}
	}

	//赋值给output
	char ss[WordMaxLen]="";
	for(int i=0;i<n;i++)
	{
		if(i!=n-1)
		{
		 strcat(ss,P[i]);
		  strcat(ss," ");
		}
		else
		{
			 strcat(ss,P[i]);
		}
	}

	for(int i=0;i<OutLen;i++)
	{
		output[i]=ss[i];
	}
}

bool IsExist(char P[][Max],int n)
{
	for(int i=0;i<n-1;i++)
	{
		if(P[i]==P[n-1])
		{
			return true;
		}

	}
	return false;
}

void StringConnect(char* dest,char source)
{
	while(*dest!='\0')
	{
	dest++;
	}
	*dest=source;
}

void SwapPointer(char *p,char*q)
{
   char temp;
   int n1=strlen(p);
   int n2=strlen(q);
 
   if(n1>n2)
   {
	   for(int i=0;i<n2;i++)
	   {
		   temp=p[i];
		   p[i]=q[i];
		   q[i]=temp;
	   }
	   for(int i=n2;i<n1;i++)
	   {
		   q[i]=p[i];
	       p[i]='\0';
	   }
   }
   else
   {
	    for(int i=0;i<n1;i++)
	   {
		   temp=p[i];
		   p[i]=q[i];
		   q[i]=temp;
	   }
	   for(int i=n1;i<n2;i++)
	   {
		   p[i]=q[i];
	       q[i]='\0';
	   }
   }
}

 

用string思想要简单一些.

#include<iostream>
#include<string>
using namespace std;
#define Max 100

void my_word(char input[], char output[]); //提取字符串中的单词,并按长度由大到小输出
bool IsLetter(char s); //判断一个字符是否为字母
bool IsExist(string tp[],int n,string s); //查重函数
int main()
{
	char input[]="some local buses, some1234123drivers";
	char output[50]="";

	my_word(input,output);
	cout<<output<<endl;
	system("pause");
	return 0;
}

void my_word(char input[], char output[])
{
	string sinput(input);
	int n=sinput.length();//输入字符串的长度
	
	string tp[Max]={""};
	
	int wordnum=0;
	int num=0;
	bool flag=false;

	for(int i=0;i<n;i++)
	{
		if(true==IsLetter(sinput[i]))
		{
			wordnum++;
           if(n-1==i)
		   {
			    string ss=sinput.substr(i-wordnum+1,wordnum);
				 if(!IsExist(tp,num,ss))
				 {
					 tp[num++]=ss;
				 }
		   }
		}
		else
		{
			if((i>1)&&(true==IsLetter(sinput[i-1]))) //如果上一次为字母 
			{
				if(wordnum>1)
				{
					string ss=sinput.substr(i-wordnum,wordnum);
					 if(!IsExist(tp,num,ss))
					 {
					 tp[num++]=ss;
					 }
				}
				wordnum=0;
			}
		}
	}
		
	for(int i=0;i<num;i++)
	{
		for(int j=num-1;j>i;j--)
		{
			if(tp[j].length()>tp[j-1].length())
			{
				tp[j].swap(tp[j-1]);
			}
		}
	}

	string soutput="";
	for(int i=0;i<num;i++)
	{
		if(0!=i)
		{
			soutput.append(" ");
		}
		 soutput.append(tp[i]);
	}

	for(int i=0;i<soutput.length();i++)
		output[i]=soutput[i];
	
}

bool IsLetter(char s)
{
	if((s>='a')&&(s<='z'))
	{
		return true;
	}
	else if((s>='A')&&(s<='Z'))
	{
		return true;
	}
	else
	{
		return false;
	}
}
bool IsExist(string tp[],int n,string s) //查重函数
{
    for(int i=0;i<n;i++)
	{
		if(s==tp[i])
		{
			return true;
		}
	}
	return false;
}


10.

一、题目描述(60分):
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。

要求实现函数:void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);

【输入】 pInputStr:  输入字符串
            lInputLen:  输入字符串长度         
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
 

【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

示例 
输入:“deefd”        输出:“def”
输入:“afafafaf”     输出:“af”
输入:“pppppppp”     输出:“p”

void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr)
{
	bool temp[26]={false}; //a-z是否已出现
	int num=0;
	for(int i=0;i<lInputLen;i++)
	{
		if(false==temp[pInputStr[i]-'a']) //如果当前字母以前没出现过
		{
			temp[pInputStr[i]-'a']=true;
			pOutputStr[num++]=pInputStr[i];
		}
	}
}


 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值