现在的位置: 首页 > 综合 > 正文

2014华为校园招聘机试——字符串过滤、压缩等

2013年10月26日 ⁄ 综合 ⁄ 共 4013字 ⁄ 字号 评论关闭

看了很多博客,发现今年去华为机试的人,同一批的题目大多都是相同的,不同批次的题目大多不相同。当然,这些题目可能在以前出现过,去年,或者前年等。所以,多看一下不同人的题目,对自己是有好处的!

说一下机试的打分情况。机试的打分是通过测试用例的成功数量来给分的,每个用例20分,一共16个用例(共三道题,共320分=60(题一)+100(题二)+160(题三)),通过一个用例,给20分,通过两个,给40分,以此类推。所以答题时一定要注意边界条件,考虑周全。

以下是一位机试者的题目,是用c实现的,我用JAVA重写了一遍,并发现他的程序有几个问题

题一:题目描述(60分):
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。
要求实现函数: 
void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr:  输入字符串
         lInputLen:  输入字符串长度         
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例 
输入:“deefd”        输出:“def”
输入:“afafafaf”     输出:“af”
输入:“pppppppp”     输出:“p”
题二:题目描述(40分):
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
要求实现函数: 
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr:  输入字符串
         lInputLen:  输入字符串长度         
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例 
输入:“cccddecc”   输出:“3c2de2c”
输入:“adef”     输出:“adef”
输入:“pppppppp” 输出:“8p”
 
题三:题目描述(50分): 
通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。
补充说明:
1. 操作数为正整数,不需要考虑计算结果溢出的情况。
2. 若输入算式格式错误,输出结果为“0”。
要求实现函数: 
void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr:  输入字符串
         lInputLen:  输入字符串长度         
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例 
输入:“4 + 7”  输出:“11”
输入:“4 - 7”  输出:“-3”
输入:“9 ++ 7”  输出:“0” 注:格式错误

题一:

public class Test4_1 {
	private static void stringFilter(char[] inputStr,long length,char[] outputStr){
		int[] a=new int[26];
		int len=0;		
		for(int i=0;i<length;i++){
			int temp=0;
			temp=inputStr[i]-'a';
			if(a[temp]==0){
				outputStr[len++]=inputStr[i];
				a[temp]=1;
			}else{
				continue;
			}
		}
	}
	
	public static void main(String[] args){
		char[] inputStr=new char[]{'d','e','e','f','d','e','p'};
		long n=inputStr.length;
		char[] outputStr=new char[(int)n];
		stringFilter(inputStr,n,outputStr);
		for(int i=0;i<n;i++){
			System.out.print(outputStr[i]);
		}
	}

输出:defp

题二:

public class Test3 {
	private static void stringZip(char[] inputStr,long length,char[] outputStr){
		int i=0;
		int len=0;		
		while(i<length){
			int time=1;
			char c=inputStr[i++];		
			while(i<length&&c==inputStr[i]){
				time++;
				i++;
			}
			if(time==1){
				outputStr[len++]=c;
			}else if(time<=9){
				outputStr[len++]=(char)(time+'0');
				outputStr[len++]=c;
			}else if(time<=99){				
				outputStr[len++]=(char)(time/10+'0');
				outputStr[len++]=(char)(time%10+'0');
				outputStr[len++]=c;				
			}else{
				//当连续重复的字符数超过99时,用一个“?”来表示。
				outputStr[len++]=(char)63;
				outputStr[len++]=c;
			}
		}		
	}	
	public static void main(String[] args){
		char[] inputStr=new char[]{'c','a','a','f','f','f','f','f','f','f','f','f','f','f','f'};
		long length=inputStr.length;
		char[] outputStr=new char[(int)length];
		stringZip(inputStr,length,outputStr);
		for(int i=0;i<outputStr.length;i++){
			System.out.print(outputStr[i]);
		}
	}
}

输出:c2a12f

题三:

public class Test4_2 {
	private static void arithmetic(char[] inputStr,long length,char[] outputStr){
		int num1=0;
		int num2=0;
		boolean first=true;
		boolean oper=false;
		boolean zero=false;
		int once=0;
		
		for(int i=0;i<length;i++){
			if(inputStr[i]==' '){
				continue;				
			}
			if(inputStr[i]>='0'&&inputStr[i]<='9'){
				if(first){
					num1=num1*10+inputStr[i]-'0';
					
				}else{
					num2=num2*10+inputStr[i]-'0';
				}
			}else{
				
				if(once==0){
					if(inputStr[i]=='-'){
						oper=false;
						once=1;
					}else{
						oper=true;
						once=1;
					}
					first=false;
				}else{
					zero=true;
					break;
				}				
			}
		}
		
		if(zero){
			outputStr[0]='0';			
		}else{
			int sum=0;
			if(oper){
				sum=num1+num2;
			}else{
				sum=num1-num2;
			}
			int i=0;
			if(sum<0){
				outputStr[i++]='-';
				sum=0-sum;
			}
			
			if(sum>=0&&sum<=9){
				outputStr[i++]=(char)(sum+'0');
			}else if(sum>9&&sum<=99){
				int tmp=sum/10;
				outputStr[i++]=(char)(tmp+'0');
				sum=sum%10;
				outputStr[i++]=(char)(sum+'0');
			}else if(sum>99){
				int tmp=sum/100;
				outputStr[i++]=(char)(tmp+'0');
				sum=sum%100;
				tmp=sum/10;
				outputStr[i++]=(char)(tmp+'0');
				sum=sum%10;
				outputStr[i++]=(char)(sum+'0');				
			}	
			
		}
	}
	
	public static void main(String[] args){
		char[] inputStr=new char[]{'4',' ','-',' ','7'};
		long n=inputStr.length;
		char[] outputStr=new char[(int)n];
		arithmetic(inputStr,n,outputStr);
		for(int i=0;i<outputStr.length;i++){
			System.out.print(outputStr[i]);
		}
	}
}

输出:-3

参考:http://blog.csdn.net/poinsettia/article/details/9569987












抱歉!评论已关闭.