如題:機試第一輪就碰到它,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\n"); return; } //驗證牌是否超過次數4 int size=0;//糊牌因子,如果有數字糊牌因子等於0也不能贏(159 88 333的例子) for (Pook p:this.list) { if(p.szie==0){ System.out.print(" ,no\n"); return; } size=size+p.szie; if(p.count> max_num){ System.out.print(p.number+"出現次數="+p.count+">"+max_num+", no\n"); 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\n":",no\n"); } /** * 麻將類 */ 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 對,亂序順子的驗證。希望大家華為機試好運!