十道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(); 

  }
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 关于JAVA经典算法40题(超实用版)

    [程序1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....public class exp2{ public static void main(String args[]){ int i=0; for(i=1;i<=20;i++)System.out.println(f(i));}public static int f(in

  • Java面试题目集锦

    1.equals方法用于比较对象的内容是否相等(覆盖以后) 2.hashcode方法只有在集合中用到 3.当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等). 4.将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中.如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接

  • 关于Java集合框架面试题(含答案)上

    1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array.随着集合的广泛使用,Java1.2提出了囊括所有集合接口.实现和算法的集合框架.在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久.它还包括在Java并发包中,阻塞接口以及它们的实现.集合框架的部分优点如下: (1)使用核心集合类降低开发成本,而非实现我们自己的集合类. (2)随着使用经过严格测试的集合框架类,代

  • 一道关于java异常处理的题目

    1.建立exception包,编写TestException.java程序,主方法中有以下代码,确定其中可能出现的异常,进行捕获处理. public class YiChang { public static void main(String[] args){ for(int i=0;i<4;i++){ int k; switch(i){ case 0: int zero=0; try{ k=911/zero; }catch(ArithmeticException e){ System.out.

  • JAVA实现链表面试题

    这份笔记整理了整整一个星期,每一行代码都是自己默写完成,并测试运行成功,同时也回顾了一下<剑指offer>这本书中和链表有关的讲解,希望对笔试和面试有所帮助. 本文包含链表的以下内容: 1.单链表的创建和遍历 2.求单链表中节点的个数 3.查找单链表中的倒数第k个结点(剑指offer,题15) 4.查找单链表中的中间结点 5.合并两个有序的单链表,合并之后的链表依然有序[出现频率高](剑指offer,题17) 6.单链表的反转[出现频率最高](剑指offer,题16) 7.从尾到头打印单链表(

  • 最有价值的50道java面试题 适用于准入职Java程序员

    下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最新版本,去掉了EJB 2.x等无用内容,补充了数据结构和算法相关的题目.经典面试编程题.大型网站技术架构.操作系统.数据库.软件测试.设计模式.UML等内容,同时还对很多知识点进行了深入的剖析,例如hashCode方法的设计.垃圾收集的堆和代.Java新的并发编程.NIO.2等,相信对准备入职的Ja

  • 探讨Java中最常见的十道面试题(超经典)

    第一,谈谈final, finally, finalize的区别. final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为final,可以保证它们在使用中不被改变.被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改.被声明为final的方法也同样只能使用,不能重载 finally?再异常处理时提供 finally 块来执行任何

  • 15个高级Java多线程面试题及回答

    Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题.在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的.他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面.用于直接面向市场交易的高容量和低延时的电子交易系统在本质上是并发的.下面这些是我在不同时间不同地点喜欢问的Jav

  • 十道java华为编程大赛题目

    以下华为编程比赛题目都是网上整理得到的,代码都是自己调试过的,由于网上java答案较少,欢迎大家批评指正,也希望对准备华为上机的童鞋们有一点点帮助.在练习的过程中成长,加油!~~ 1. 就餐抽查(30分) 问题描述: 某公司由于人多,午餐分为多批次就餐,严格要求每批次就餐时间.并定期抽查就餐情况.请编写程序实现就餐抽查情况. 要求实现函数: void check_lunch(int num, int time,int input[], int output[]) [输入]  int num,就餐

  • Java十道入门易踩坑题分析后篇

    目录 一,写在前面 二,代码分析 代码分析① 代码分析② 代码分析③ 代码分析④ 代码分析⑤ 代码分析⑥ 代码分析⑦ 代码分析⑧ 代码分析⑨ 代码分析⑩ 一,写在前面 本篇主要讲类和对象这一章节的踩坑题,这一章也相对复杂和难理解,面试也是常考的一类题,我分析的都是比较经典的,读者觉得自己学习的不够扎实,可以收藏,如果觉得写发不错的话,求个免费的赞,谢谢! 二,代码分析 代码分析① 阅读如下代码. 请问,对语句行 test.hello(). 描述正确的有() package NowCoder; c

  • java并发编程专题(十)----(JUC原子类)基本类型详解

    这一节我们先来看一下基本类型: AtomicInteger, AtomicLong, AtomicBoolean.AtomicInteger和AtomicLong的使用方法差不多,AtomicBoolean因为比较简单所以方法比前两个都少,那我们这节主要挑AtomicLong来说,会使用一个,其余的大同小异. 1.原子操作与一般操作异同 我们在说原子操作之前为了有个对比为什么需要这些原子类而不是普通的基本数据类型就能满足我们的使用要求,那就不得不提原子操作不同的地方. 当你在操作一个普通变量时,

  • Java十道入门易踩坑题分析前篇

    目录 1,java基本类型 2,java包装类 3,Java编译 4,JDK,JVM,JRE 5,类型转换 6,转义字符 7,标识符 8,类型转换 9,赋值符号 10,打印一个字符串 1,java基本类型 下面属于java基本数据类型的有( ) A.String B.byte C.char D.Array Java基本数据类型分为三种,数值型,字符型,布尔型 数值型: 整型:byte.short.int.long 浮点型:double.float 字符型:char 布尔型:boolean Arr

  • java并发编程死锁定义及如何避免死锁

    目录 场景模拟分析 场景一:狭路相逢 场景二:冷战 场景三:哲学家就餐 场景四:竞争资源 死锁是什么? 产生死锁的的四个条件如下: 如何避免死锁? 方案一:破坏不剥夺条件 方案二:破坏请求与保持条件 方案三:破坏循环等待条件 方案四:破坏互斥条件 场景模拟分析 场景一:狭路相逢 在星期天的早上十点半,你在公路上开着车,这是一条窄路,只能容纳一辆车.这时,迎面又驶来一辆车,你们都走到一半,谁也不想倒回去,于是各不相让.陷入无尽的等待. 场景二:冷战 你和她吵架了,谁也不理谁,甚至晚饭时间都各自煮饭

  • 50 道Java 线程面试题(经典)

    下面是 Java 线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要 100 毫秒,那么用十个线程完成改任务只需 10 毫秒.Java 在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点.欲了解更多详细信息请点击这里. 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很

  • java多线程编程实例

    一.相关知识: Java多线程程序设计到的知识: (一)对同一个数量进行操作 (二)对同一个对象进行操作 (三)回调方法使用 (四)线程同步,死锁问题 (五)线程通信 等等 二.示例一:三个售票窗口同时出售20张票; 程序分析: 1.票数要使用同一个静态值 2.为保证不会出现卖出同一个票数,要java多线程同步锁. 设计思路: 1.创建一个站台类Station,继承Thread,重写run方法,在run方法里面执行售票操作!售票要使用同步锁:即有一个站台卖这张票时,其他站台要等这张票卖完! 2.

  • JAVA多线程编程实例详解

    本文实例讲述了JAVA多线程编程.分享给大家供大家参考,具体如下: 进程是系统进行资源调度和分配的一个独立单位. 进程的特点 独立性:进程是系统中独立存在的实体,拥有自己的独立资源和私有空间.在没有经过进程本身允许的情况下,不能直接访问其他进程. 动态性:进程与程序的区别在于,前者是一个正在系统中活动的指令,而后者仅仅是一个静态的指令集合 并发性:多个进程可以在单个处理器上并发执行,而不受影响. 并发性和并行性的区别: 并行性:在同一时刻,有多条指令在多个处理器上同时执行(多个CPU) 并发性:

  • Java持久层面试题目及答案整理

    什么是ORM? 对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术: 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据(在Java中可以用XML或者是注解),将程序中的对象自动持久化到关系数据库中或者将关系数据库表中的行转换成Java对象,其本质上就是将数据从一种形式转换到另外一种形式. Hibernate中SessionFactory是线程安全的吗?Session是线程安全的吗(两个线程能

  • 详解JAVA 函数式编程

    1.函数式接口 1.1概念: java中有且只有一个抽象方法的接口. 1.2格式: 修饰符 interface 接口名称 { public abstract 返回值类型 方法名称(可选参数信息); // 其他非抽象方法内容 } //或者 public interface MyFunctionalInterface { void myMethod(); } 1.3@FunctionalInterface注解: 与 @Override 注解的作用类似,Java 8中专门为函数式接口引入了一个新的注解

随机推荐