• 华为编程大赛汇总----java


           以下华为编程比赛题目都是网上整理得到的,代码都是自己调试过的,由于网上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分) 
    问题描述:  
    已知某农场中有一群鸡和兔子,总共有M个头和N只脚,计算总共有多少鸡和兔子 · 
    要求实现函数:  
    public String getFowlsNum(int iHeadNum, int iFootNum, ArrayList iChickenNum, ArrayList iRabbitNum) 
    【输入】iHeadNum:  总共头的数量   
       iFootNum: 总共脚的数量 
    【输出】iChickenNum: 鸡的数量   
         iRabbitNum: 兔子的数量 
    【返回】"0":           找到符合要求的鸡和兔子的数量 
                   "-1":          未找到符合要求的数量 
    示例  
    输入:iHeadNum =201, iFootNum=604 
    输出:iChickenNum.add(100), iRabbitNum.add(101) 返回:"0"  
    输入:iHeadNum =201, iFootNum=123 
    输出: iChickenNum.add(0), iRabbitNum.add(0) 返回:"-1"
     

     
    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";
    		  }	 
    		 }
    	 }
     	 
     


    4.字符串压缩(30分) 
    问题描述:  
    将给定的字符串,按照规格压缩,输出压缩后的字符串。压缩规格为:相同字符连续,则压缩为“字符+数字个数”,如”aaaa”压缩为”a4” 
    注:1、仅是单个字符连续才压缩,如babababa则不能压缩 
    2、待压缩字符串中不包含数字和转义符 · 
    要求实现方法:  
    public String compressStr(String srcStr) 【输入】srcStr:  待压缩的字符串 
    【输出】无 
    【返回】            压缩后的字符串 
    示例  

    输入: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分)
    问题描述
    将给定的无序整数数组降序排列后输出,输入的无序数组长度为N,类型为unsigned int
    要求实现函数
     void DscSort (const int InputArray[], unsigned int n, int OutputArray[])
     【输入】InputArray:  给定的无序数组
                   n:     数组长度
     【输出】OutputArray: 排序后的数组
     【返回】无
     示例
     输入:InputArray={1,5,4,8,3,2,9,6,7,0}

     输出: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分)

    问题描述
    如果一个数字十进制表达时,不存在连续两位相同,则称之为“不重复数”。例如,105、1234和12121都是“不重复数”,而11、100和1225不是。给定一个正整数A,返回大于A的最小“不重复数”。A小于100000
    要求实现函数
    int getNotRepeatNum(int iValue)
    【输入】lValue:  给定的数字,返回大于该值的最小不重复数
    【输出】无
    【返回】大于iValue的最小不重复数
    示例
    输入:iValue =54
    返回: 56
    输入:iValue =10
    返回: 12    
    输入:iValue =98
    返回: 101
    输入:iValue =21099
    返回: 21201

    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分)
    问题描述:
    在扑克中,牌的类型包括:A(1),2,3,4,5,6,7,8,9,T(10),J(11),Q(12),K(13),D(小鬼devilkin),B(大鬼Belial)。
    请做一个简单的程序,输入两张牌的字符,比如"2"和"K",判断牌的大小,规则如下:
    B>D>2>A>K>Q>J>10....>3 最小的为3
    判断规则:比较cFirstCard和cSecondCard,如果FirstCar大,那么返回1;如果相同,返回0;如果FirstCar小,返回-1。
    要求实现函数:
    int CompareOneCard(char cFirstCard, char cSecondCard)
    【输入】 char cFirstCard:需要比较的第一张牌
    char cSecondCard: 需要比较的第二张牌
    注意:输入的为字符’A’,’2’,…,’9’,’T’,’J’,’Q’,’K’,’D’,’B’
    【返回】  int类型:返回两张牌的比较结果
    注意:不用考虑输入的合法性,这个由函数的使用者保证。输入的牌均为字符’1’,’2’…’9’,大写的’A’,’T’,’J’,’Q’,’K’,’D’,’B’。
    举例:  
    输入:’4’、’5’,返回:-1

    输入:’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分)
    问题描述:
    在成都,流行一种扑克游戏叫“干瞪眼”。使用扑克牌,包括:A(1),2,3,4,5,6,7,8,9,T(10),J(11),Q(12),K(13)。
    注意:10用T替换,这里暂时不考虑大鬼和小鬼。
    两手牌的大小规则如下:
    a)    单牌:4比3大,5比4大,只有两张牌刚好大一点时才能进行比较,比较顺序为:A>K>Q>J>T>9>8>7>6>5>4>3。
    比如:6大于5,但是不能比4大,6和4不能比较。单牌2属于特殊牌,他可以和其他所有普通单牌比较,并且是最大的。
    请注意3,他不能大于任何牌。
    b)    对子:即两张牌的点数相同,规则和单牌相似,也需要进行类似处理。两个2是特殊对子,可以大于所有的其他对子。
    注意:对子和单牌是不能进行比较的。
    c)    炸弹:3个点数相同的牌。炸弹可以大于任何单张和对子,炸弹之间的比较不用像单牌和对子那样,只能大一点才能比较。
    只要满足:222>AAA>KKK>QQQ>JJJ>TTT>…>333的规则的即可。即222是最大的,AAA可以大于KKK,也可以大于333。
    d)    其他规则暂不考虑实现
    现在请你实现一个程序,自动判断两手牌的大小,注意:输入的牌只会出现3种类型:单张,对子,炸弹。张数最多3张。
    不会出现2个单牌。比如”25”,也不会出现一个对子加单牌,比如”334”等,类似输入异常你可以不用考虑。
    但是pFirstCards为单牌,pSecondCards为对子,类似的组合输入是合法的。
    要求实现函数:
    int CompareCards(char *pFirstCards, char *pSecondCards)
    【输入】  char *pFirstCards:需要比较的第一手牌
    char *pSecondCards:需要比较的第二手牌
    【返回】  int 类型,返回值说明:
    如果pFirstCards和 pSecondCards无法比较,比如”3”和”6”;”55”和”6”等,返回0。
    如果pFirstCards大于pSecondCards,返回1。
    如果pFirstCards等于 pSecondCards,返回2。
    如果pFirstCards小于 pSecondCards,返回3。
    注意:不用考虑输入的合法性,这个由函数的使用者保证。输入的牌均为字符’1’,’2’..’9’,大写的’A’,’T’,’J’,’Q’,’K’。
    示例
    输入: “77”、 “33”,返回:0

    输入: “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分) 
    问题描述: 
    将一个N*N矩阵的行列互换。 · 
    要求实现函数: 
    public String matrixTranspose (String inArr, int n) 
    【输入】inArr:       输入的字符矩阵 
        n:          N*N矩阵的行数 
    【返回】转置后的字符矩阵 注: 
    输入输出的矩阵都是以一维形式保存的二维数组,比如输入为"1,2,3,4,5,6,7,8,9",实际上表示如下3*3的矩阵: 
    1,2,3,4,5,6,7,8,9  
    示例 

    输入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);//去掉尾巴逗号
    	  }
    }	 
    	 
     
     

    10.路灯(20分)

    某省会城市街道纵横交错,为了监控路灯的运行状况,每条街道使用一个数字字符串标识该街道上所有路灯的运行状况。
    假设路灯只有如下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();
    		 
    	  }
    }	 
    	 
     
     

  • 相关阅读:
    应当将指针变量用“==”或“!=”与 NULL 比较
    不可将浮点变量用“==”或“!=”与任何数字比较
    应当将整型变量用“==”或“!=”直接与 0 比较
    不可将布尔变量直接与 TRUE、FALSE 或者 1、0 进行比较
    不要把程序中的复合表达式与“真正的数学表达式”混淆
    不要有多用途的复合表达式
    不要编写太复杂的复合表达式
    用括号确定表达式的操作顺序
    为了防止某一软件库中的一些标识符和其它软件库中的冲突
    类的数据成员加前缀 m_(表示 member)
  • 原文地址:https://www.cnblogs.com/oversea201405/p/3766901.html
Copyright © 2020-2023  润新知