如题:机试第一轮就碰到它,90分钟不够直接挂了。在此记录以供大家参考
题目:麻将有1-9的数字,每个数字只能出现4次。相同的两个数字为对子,例如22;连续的3个数字为顺子,例如123;相同的三个数字为刻子,例如333
糊牌规则:当玩家手中的牌数量为:2、5、8、11、14张时,且是对子、顺子、刻子的组合则 达到糊牌标准。希望下次机考把输出说明说清楚,这点很坑。
import java.util.*; /** * @Auther: lanhaifeng * @Date: 2020/5/20 0020 15:07 * @Description: * @statement: 题目:麻将有1-9的数字,每个数字只能出现4次。相同的两个数字为对子,例如22;连续的3个数字为顺子,例如123;相同的三个数字为刻子,例如333 * 糊牌规则:当玩家手中的牌数量为:2、5、8、11、14张时,且是对子、顺子、刻子的组合则 达到糊牌标准。 */ public class Main { private int max_num=4;//同一张牌最多出现次数 List<Pook> list=new ArrayList<Pook>();//存放麻将的记录,因为麻将只有1-9 public static void main(String[] args) { Main main=new Main(); Scanner scanner=new Scanner(System.in); System.out.println("请出入当前的牌小于0大于9将被自动过滤,例子:12355"); main.look(scanner); } /** * 拆分数组 * @param scanner */ public void look(Scanner scanner){ String num=scanner.next(); String[] split = num.split("");//拆分输入的数字 List<Integer> array=new ArrayList<Integer>(); //把输入数字装入验证的数组 int temp; for (int i = 0; i < split.length; i++) { temp=Integer.parseInt(split[i]); //自动踢出输入小于0和大于9的牌 if(temp> 0 && temp < 10){ array.add(temp); } } //验证输入的数字是否符合糊牌的规则,1-9范围这里没验证 change(array); } /** * 校验 * @param array */ public void change(List<Integer> array){ Pook pook; for (int i = 0; i < array.size(); i++) { //下标判断>3 if(i<array.size()-2){ int[] arrays={array.get(i),array.get(i+1),array.get(i+2)}; Arrays.sort(arrays);//进行一个升序排序,后面既使顺子顺序错位也可以识别 //验证刻字 if(arrays[0]==arrays[1] && arrays[0]==arrays[2]){ addPook(new Pook(array.get(i),3,3)); System.out.print(array.get(i)+""+array.get(i+1)+""+array.get(i+2)+"刻子 "); i=i+2; continue; } //验证顺子 if(arrays[2]-arrays[1]==1 && arrays[1]-arrays[0]==1 ){ //顺子的糊牌因子每个成员分配1,一个顺子是3 addPook(new Pook(array.get(i),1,1)); addPook(new Pook(array.get(i+1),1,1)); addPook(new Pook(array.get(i+2),1,1)); System.out.print(array.get(i)+""+array.get(i+1)+""+array.get(i+2)+"顺子 "); i=i+2; continue; } } //下标判断>2 if(i<array.size()-1){ //验证对子 if(array.get(i)==array.get(i+1)){ addPook(new Pook(array.get(i), 2, 2)); System.out.print(array.get(i)+""+array.get(i+1)+"对子 "); i++; continue; } } addPook(new Pook(array.get(i),1,0)); System.out.print(array.get(i)); } if(this.list.size()>14){ System.out.print("牌数超过14张 ,no "); return; } //验证牌是否超过次数4 int size=0;//糊牌因子,如果有数字糊牌因子等于0也不能赢(159 88 333的例子) for (Pook p:this.list) { if(p.szie==0){ System.out.print(" ,no "); return; } size=size+p.szie; if(p.count> max_num){ System.out.print(p.number+"出现次数="+p.count+">"+max_num+", no "); return; } } //验证糊牌因子 System.out.print(" 糊牌因子="+size); switch (size) { case 2: print(true); break; case 5: print(true); break; case 8: print(true); break; case 11: print(true); break; case 14: print(true); break; default: print(false); break; } } //添加牌 public void addPook(Pook pook){ if(this.list.size()==0){ this.list=new ArrayList<Pook>(9); this.list.add(pook); return; }else { for (Pook p:this.list) { if(p.number==pook.number){ p.count=p.count+pook.count; p.szie=p.szie+pook.szie; return; } } this.list.add(pook); } } /** * 打印结果 * @param b */ public void print(boolean b){ System.out.println(b==true?",yes ":",no "); } /** * 麻将类 */ class Pook{ int number;//数字 int count;//次数 int szie;//糊牌因子 public Pook(int number, int count, int szie) { this.number = number; this.count = count; this.szie = szie; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public int getSzie() { return szie; } public void setSzie(int szie) { this.szie = szie; } } public List<Pook> getList() { return list; } public void setList(List<Pook> list) { this.list = list; } }
我90分钟是没做出来,调试了基本无BUG,支持 7 对,乱序顺子的验证。希望大家华为机试好运!