以下华为编程比赛题目都是网上整理得到的,代码都是自己调试过的,由于网上java答案较少,欢迎大家批评指正,也希望对准备华为上机的童鞋们有一点点帮助。在练习的过程中成长,加油!~~
1. 就餐抽查(30分)
问题描述:
某公司由于人多,午餐分为多批次就餐,严格要求每批次就餐时间。并定期抽查就餐情况。请编写程序实现就餐抽查情况。
要求实现函数:
void check_lunch(int num, int time,int input[], int output[])
【输入】 int num,就餐总人数
int time,就餐分批数
char input[],就餐情况
【输出】 char output[], 违规就餐情况
【返回】 无
注:对就餐分3批的情况,12人就餐,正确的就餐情况应如下分布[1,2,3,1,2,3,1,2,3,1,2,3],不符合该分布的即是违规,输出时对相应位置0。
示例
1) 输入:num = 12,time = 3,input =[1,2,3,3,1,3,1,1,1,1,2,3]
输出:output = [1,2,3,0,0,3,1,0,0,1,2,3]
2) 输入:num = 11,time = 4,intput = [1,2,3,4,2,3,3,4,1,2,3]
输出:output = [1,2,3,4,0,0,3,4,1,2,3]
package com.sheepmu.text; import java.util.Arrays; /* * @author sheepmu */ public class HWCompetition { public static void main(String[] args){ int num=11,time=4; int[] input={1,2,3,4,2,3,3,4,1,2,3}; // int[] output=new int[]{}; int[] output=new int[num]; HWCompetition hwc=new HWCompetition(); hwc.check_lunch( num, time, input, output); } void check_lunch(int num, int time,int input[], int output[]){ System.out.println(Arrays.toString(input)); int j=0; for(int i=0;i<num;i++){ int yushu=(i+1)%time; if(yushu!=0){ if(input[i]==yushu){ output[j]=yushu; } else output[j]=0; j++; } else{//余数==0的情况 if(input[i]==time){ output[j]=time; } else output[j]=0; j++; } } System.out.println(Arrays.toString(output)); } }
2. 输入联想(30分)
问题描述:
输入联想功能是非常实用的一个功能,请编程实现类似功能。
要求实现函数:
void auto_complete(char *str, char *tmp,char *output)
【输入】 char *str,候选字符串
char *tmp,输入字符串
【输出】 int *output,联想匹配的字符串
【返回】 无
注:候选字符串以空格隔开,输入字符串仅从字符串开始处匹配。将匹配的子字符串输出,同样以空格隔开。如无匹配成功的子字符串,则输出空字符串。
示例
1) 输入:str = chengdu chongqing,tmp = c
输出:output = chengdu Chongqing
2) 输入:str = chengdu chongqing,tmp = che
输出:end = Chengdu
3)输入:str = beijing nanjing,tmp = jing
输出:end =
方法一:
package com.sheepmu.text; import java.util.ArrayList; import java.util.List; /* * @author sheepmu */ public class HWCompetition { public static void main(String[] args){ String str="chengdu chongqing"; String tmp="che"; String output=""; HWCompetition hwc=new HWCompetition(); hwc.auto_complete( str,tmp, output); } void auto_complete(String str,String tmp, String output){ String[] strs=str.split("\\s"); List<String> list=new ArrayList<String>(); for(int i=0;i<strs.length;i++) list.add(strs[i]); System.out.println("list--->"+list); System.out.println("tmp--->"+tmp); char[] tmps=tmp.toCharArray(); int len_list=list.size(); int len_t=tmps.length; for(int j=0;j<len_list;j++){ int len_list_j=list.get(j).length(); char[] list_j=list.get(j).toCharArray(); for(int k=0;k<len_t;k++){ if(len_t>len_list_j){ list.remove(j); len_list--;//!!!!!!!!!!!!!!! j--;//!!!!!!!!!!!!! 要是不这样28行会出问题,因为remove后size变成了1,但是j即index却变成了1 break; } else {//temp的长度小于带收索的长度 if(tmps[k]!=list_j[k]){ list.remove(j); len_list--;//!!!!!!!!!!!!!!! j--;//!!!!!!!!!!!!! break; } } } } // output= list.toString();//这样会 [chengdu] ,即会带有两边的[] if(!list.isEmpty()){ StringBuffer sb=new StringBuffer(); sb.append("end="); for(String result:list){ sb.append(result+" ");//加上空格!!最后再给去掉尾巴的“ ”; } output=sb.toString().trim();//!! } else{ output="end="; } System.out.println(output); } }
方法二:
package com.sheepmu.text; import java.util.ArrayList; import java.util.List; /* * @author sheepmu */ public class HWCompetition { public static void main(String[] args){ String str="chengdu chongqing"; String tmp="che"; String output=""; HWCompetition hwc=new HWCompetition(); hwc.auto_complete( str,tmp, output); } void auto_complete(String str,String tmp, String output){ String[] strs=str.split("\\s");//和下面一样,应该是只有\s,\d啊之类的才加\ List<String> list=new ArrayList<String>(); for(int i=0;i<strs.length;i++) list.add(strs[i]); System.out.println("list--->"+list); System.out.println("tmp--->"+tmp); int len_list=list.size(); for(int j=0;j<len_list;j++){//还有一个好方法:!list.get(j).startsWith(tmp);!!!!!!!!!!!!!!!!!!!! if(!list.get(j).matches(tmp+"[a-z]*")){//正则表达式就是爽啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! list.remove(j); len_list--; j--; } } if(!list.isEmpty()){ StringBuffer sb=new StringBuffer(); sb.append("end="); for(String result:list){ sb.append(result+" ");//加上空格!!最后再给去掉尾巴的“ ”; } output=sb.toString().trim();//!! } else{ output="end="; } System.out.println(output); } }3. 农场计数问题(20分)
package com.sheepmu.text; import java.util.ArrayList; /* * @author sheepmu */ public class HWCompetition { public static void main(String[] args){ int iHeadNum=201; int iFootNum=604; ArrayList iChickenNum=new ArrayList(); ArrayList iRabbitNum=new ArrayList(); HWCompetition hwc=new HWCompetition(); hwc.getFowlsNum( iHeadNum,iFootNum,iChickenNum,iRabbitNum); } public String getFowlsNum(int iHeadNum,int iFootNum,ArrayList iChickenNum,ArrayList iRabbitNum){ if(iFootNum%2!=0){//!!!!! System.out.println("iChickenNum.add(0),iRabbitNum.add(0)"); return "-1";//如果脚的数量为奇数,则明显不对, } else{ int ji=2*iHeadNum-iFootNum/2; int tui=iFootNum/2- iHeadNum; if(ji>=0&&tui>=0) System.out.println("iChickenNum.add("+ji+"),iRabbitNum.add("+tui+")"); return "0"; } } }
输入:srcStr = "aaacccddef" 返回:"a3c3d2ef"
方法一:(用ArrayList)详情见华为上机汇总第 8 题
方法二:(用String,可读性不如上者,就当为熟悉API吧)
package com.sheepmu.text; import java.util.ArrayList; import java.util.List; /* * @author sheepmu */ public class HWCompetition { public static void main(String[] args){ String str="abcddef"; HWCompetition hwc=new HWCompetition(); String result=hwc.compressStr(str); System.out.println(result); } public String compressStr(String str){ StringBuffer sb=new StringBuffer(); for(int i=0;i<str.length();i++){ if(str.length()==0) break; if(str.length()==1) sb.append(str.charAt(i));//针对aaacccddef for(int j=i+1;j<str.length();j++){ if(str.charAt(i)==str.charAt(j)){ if(j==str.length()-1){//针对当后面一直没有出现不同时:aaacccddeffff sb.append(str.length()).append(str.charAt(i)); str=str.substring(j);//长度只剩0了。一定要赋给新的str!!!!!!!!!!!!!!!!!!!!!!!! break; } } else{//遇到不等时 if(j==1) sb.append(str.charAt(i)); else sb.append(j).append(str.charAt(i)); System.out.println(sb.toString()); str=str.substring(j); i--; break; } } } return sb.toString(); } }5. 排序算法(20分)
输出:OutputArray={9,8,7,6,5,4,3,2,1,0}
方法一:(直接调用api)思路:升序再倒过来输出
package com.sheepmu.text; import java.util.Arrays; /* * @author sheepmu */ public class HWCompetition { public static void main(String[] args){ int[] inputArray={1,5,4,8,3,2,9,6,7,0}; int n=inputArray.length; int[] outputArray=new int[n]; HWCompetition hwc=new HWCompetition(); hwc.dscSort (inputArray,n,outputArray); } void dscSort (int InputArray[], int n, int OutputArray[]){ Arrays.sort(InputArray);//升序 int i=0; while(--n>=0){ OutputArray[i++]=InputArray[n]; } System.out.println(Arrays.toString(OutputArray)); } }方法二:(若题目规定不能调用api)
package com.sheepmu.text; import java.util.Arrays; /* * @author sheepmu */ public class HWCompetition { public static void main(String[] args){ int[] inputArray={1,5,4,8,3,2,9,6,7,0}; int n=inputArray.length; int[] outputArray=new int[n]; HWCompetition hwc=new HWCompetition(); hwc.dscSort (inputArray,n,outputArray); System.out.println(Arrays.toString(inputArray)); } void dscSort (int InputArray[], int n, int OutputArray[]){//自己写:快排降序 int high=0; int low=n-1; sort(InputArray,high,low); } void sort(int InputArray[],int high,int low){ int i,j,temp; i=high;//高端下标 j=low;//低端下标 temp=InputArray[i];//取第一个元素为标准元素。 while(i<j){//递归出口是 low>=high while(i<j&&temp>InputArray[j])//后端比temp小,符合降序,不管它,low下标前移 j--;//while完后指比temp大的那个 if(i<j){ InputArray[i]=InputArray[j]; i++; } while(i<j&&temp<InputArray[i]) i++; if(i<j){ InputArray[j]=InputArray[i]; j--; } }//while完,即第一盘排序 InputArray[i]=temp;//把temp值放到它该在的位置。 if(high<i) //注意,下标值 sort(InputArray,high,i-1);//对左端子数组递归 if(i<low) //注意,下标值 sort(InputArray,i+1,low);//对右端子数组递归 ;对比上面例子,其实此时i和j是同一下标!!!!!!!!!!!!! } }
6.查找最大的不重复数(30分)
问题描述package com.sheepmu.text; import java.util.Arrays; import java.util.Scanner; /* * @author sheepmu */ public class HWCompetition { public static void main(String[] args){ Scanner input=new Scanner(System.in); int a=input.nextInt(); System.out.println("输入的数字为---->"+a) ; HWCompetition hwc=new HWCompetition(); int result=hwc.getNotRepeatNum(a); System.out.println("返回的大于"+a+"的最小不重复数---->"+result) ; } int getNotRepeatNum( int iValue){ int i=0; for(i=iValue+1 ;i<100000;i++){ if(!isRepeatNum(i)){ break;//!!!不然要白白运行好多好多次 } } return i; } public boolean isRepeatNum(int a){ String str=a+""; char[] cs=str.toCharArray(); int len=cs.length; for(int i=0;i<len-1;i++){//因为后面要i+1,如果是i<len就要下标越界。 if(cs[i]==cs[i+1]) return true; } return false; } }7. 扑克牌比较(30分)
输入:’6’、’6’,返回:0
package com.sheepmu.text; /* * @author sheepmu */ public class HWCompetition { public static void main(String[] args){ char cFirstCard='5'; char cSecondCard= '6'; HWCompetition hwc=new HWCompetition(); int result=hwc.CompareOneCard(cFirstCard,cSecondCard); System.out.println("比较的结果"+result); } int CompareOneCard(char cFirstCard, char cSecondCard){ int iF=getReallN(cFirstCard); System.out.println("iF--->"+ iF); int iS=getReallN(cSecondCard); System.out.println("iS--->"+ iS); return iF>iS ? 1: iF<iS? -1:0 ;//不需要添括号 } int getReallN(char c){ int value=0; switch(c){ case 'T': value=10; break; case 'J': value=11; break; case 'Q': value=12; break; case 'K': value=13; break; case 'A': value=14; break; case '2': value=15; break; case 'D': value=16; break; case 'B': value=17; break; case '3': case '4': case '5': case '6': case '7': case '8': case '9': // value=c; // 超级笨蛋错误!!!!! 若输入9,'9'=57!!!!字符9对于的值不是数字9而是该字符本身对于的值。 value=Integer.parseInt(c+"") ; break; } return value; } }8. 干瞪眼(30分)
输入: “77”、 “77”,返回:2
思路:1. 1vs2 or 2vs1 此情况只需判断长度即可得出结果,无需后续比较
2. 1vs1 or 2 vs2 同一种比较方式
3. 3vs3 和情况2不同的比较方式
4. 3 vs 非3 or 非3vs3
package com.sheepmu.text; import java.util.Arrays; /* * @author sheepmu */ public class HWCompetition { public static void main(String[] args){ String pFirstCards="QQ"; String pSecondCards="444"; HWCompetition hwc=new HWCompetition(); int result=hwc.CompareCards(pFirstCards,pSecondCards); System.out.println("比较的结果"+result); } int CompareCards( String pFirstCards, String pSecondCards){ int len1=pFirstCards.length(); int len2=pSecondCards.length(); if((len1==1&&len2==2)||(len1==2&&len2==1))// 1vs2,无法比较。为提供效率,能先搞定的搞定,这种情况就不需要执行后面的了。 return 0; int[] is1=getReallNs(pFirstCards); int[] is2=getReallNs(pSecondCards); // System.out.println(Arrays.toString(is1));//[12, 12] // System.out.println(Arrays.toString(is2));//[4, 4, 4] if((len1==1&&len2==1)||(len1==2&&len2==2)){//1vs1 或者2vs2,比较方式是一样的。其实不用天括号 if(Math.abs(is1[0]-is2[0])==1) //有题目知,长度为2肯定是对子情况 return is1[0]-is2[0]>0? 1:3; else if(is1[0]==is2[0]) return 2; else return 0; } if(len1==3&&len2==3) //炸弹不可能相等,因为一副牌没有6个一样的。 return is1[0]>is1[0]? 1:3; if(len1==3&&len2<3||len1<3&&len2==3) return len1==3? 1:3; return 0;//其实测试用例应该永远都不会执行这一句。 } int[] getReallNs(String s){ int len=s.length(); int[] cs =new int[len]; for(int i=0;i<len;i++){ cs[i]=getReallN(s.charAt(i)); } return cs; } int getReallN(char c){ int value=0; switch(c){ case 'T': value=10; break; case 'J': value=11; break; case 'Q': value=12; break; case 'K': value=13; break; case 'A': value=14; break; case '2': value=15; break; case '3': case '4': case '5': case '6': case '7': case '8': case '9': // value=c; // 超级笨蛋错误!!!!! 若输入9,'9'=57!!!!字符9对于的值不是数字9而是该字符本身对于的值。 value=Integer.parseInt(c+"") ; break; } return value; } }9. 矩阵转置(20分)
输入InArr ="1,2,3,4,5,6,7,8,9",n=3 返回:"1,4,7,2,5,8,3,6,9"
注:笔者人为的把题目稍微添成了每项为字符串而不是字符。字符更简单,字符串时注意截取时,13不是1,3
package com.sheepmu.text; import java.util.Arrays; /* * @author sheepmu */ public class HWCompetition { public static void main(String[] args){ String inarr="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16"; int n=4; System.out.println("inarr---->"+inarr); HWCompetition hw=new HWCompetition(); String result=hw.matrixTranspose(inarr,n); System.out.println("result---->"+result); } public String matrixTranspose(String inarr,int n){//要把字符串中的逗号去掉,不然逗号也是string的一个下标值了,输出时再加上就是咯 String[] ss=inarr.split(","); String[][] css=new String[n][n]; int k=0; for(int i=0;i<n;i++){//字符串转换为二维数组 for(int j=0;j<n;j++){ css[i][j]=ss[k]; k++; } } StringBuffer sb=new StringBuffer(); for(int i=0;i<n;i++){// 二维数组逆置 for(int j=0;j<n;j++){ sb.append(css[j][i]+",");//尾巴多了一个, } } return sb.substring(0, sb.length()-1); } }方法二:更简单,完全不需矩阵。
package com.sheepmu.text; import java.util.Arrays; /* * @author sheepmu */ public class HWCompetition { public static void main(String[] args){ String inarr="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16"; int n=4; System.out.println("inarr---->"+inarr); HWCompetition hw=new HWCompetition(); String result=hw.matrixTranspose(inarr,n); System.out.println("result---->"+result); } public String matrixTranspose(String inarr,int n){//要把字符串中的逗号去掉,不然逗号也是string的一个下标值了,输出时再加上就是咯 String[] ss=inarr.split(","); StringBuffer sb=new StringBuffer(); for(int i=0;i<n;i++){ //对于题目例子: 需要的下标顺序是 036147258 for(int j=i;j<ss.length;j+=n){ sb.append(ss[j]+",");//尾巴多了逗号 } } return sb.substring(0, sb.length()-1);//去掉尾巴逗号 } }
某省会城市街道纵横交错,为了监控路灯的运行状况,每条街道使用一个数字字符串标识该街道上所有路灯的运行状况。
假设路灯只有如下3种状态(分别用数字0, 1, 2标识,一盏路灯只对应其中一种状态):
0 标识路灯熄灭;
1 标识路灯开启;
2 标识路灯故障;
请根据输入的字符串,找出该街道上连续的处于相同状态的路灯的最大个数。若两种状态的路灯数量相同,则返回最先出现的路灯状态。
输入
街道上连续的路灯组成的状态字符串。字符串中只包含数字,每个路灯的状态为0,1,2中的一种状态。如“1101”代表4盏路灯,第3盏路灯为熄灭状态,其它3盏为开启状态。
输出
连续为相同状态的路灯的最大数量;
上述路灯的状态;
要求:先输出数量,再输出状态,两个整数间采用一个空格间隔。如输出:
53 2
样例输入
112200111
样例输出
3 1
package com.sheepmu.text; import java.util.Arrays; /* * @author sheepmu */ public class HWCompetition { public static void main(String[] args){ String s="112001110";//这类题一定要注意最后全部相同的情况,即没有再出现与之不同的,不然很容易死循环。 System.out.println("inarr---->"+s); HWCompetition hw=new HWCompetition(); String result=hw.ludeng(s); System.out.println("题目结果---->"+result); } public String ludeng(String s){//要把字符串中的逗号去掉,不然逗号也是string的一个下标值了,输出时再加上就是咯 char[] as=s.toCharArray(); int len=as.length; int maxc=1; // int mubiaobindex=0;//不要制造多余变量 // int mubiaovalue=as[0]; int bindex=0;//如果需要返回最大连续的第一个下标,如此时的6;若题目有此需求:则设置两个变量:“每部分”的次数+首次出现的下标。 char value=as[0];//若题目需要返回最大长度部分的值即本题状态的1 for(int i=0;i<len-1; ){ int count=1;//每次外层循环是把count令为1,开始新的计数 bindex=i; value=as[i]; for(int j=i+1;j<len;j++){ if(as[i]!=as[j]){ i=j; break; } else{ i++;//!!!!!!!!!!!如果后面没有出现不同的;如果不加这一句,外层循环会一直执行。 count++; } } if(count>maxc){ maxc=count; // mubiaobindex=bindex; // mubiaovalue=value; System.out.println("maxc--->"+maxc+" 起始下标---->"+bindex+" 状态---->"+value); } } StringBuffer sb=new StringBuffer(); return sb.append(maxc+" ").append(value).toString(); } }