看了很多博客,发现今年去华为机试的人,同一批的题目大多都是相同的,不同批次的题目大多不相同。当然,这些题目可能在以前出现过,去年,或者前年等。所以,多看一下不同人的题目,对自己是有好处的!
说一下机试的打分情况。机试的打分是通过测试用例的成功数量来给分的,每个用例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: 输入字符串
【输出】 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: 输入字符串
【输出】 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: 输入字符串
【输出】 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