华为机试---判断麻将能否胡牌

题目

具体题目没有记下来,大概是说麻将胡牌的规则,然后输入‘1’-‘9’的数字组成的字符串,字符串长度小于15.

能胡牌打印‘yes’不能胡牌打印‘no’.

胡牌的规则大概是一个对子可以,如 ‘11’、‘22’之类;

对子和三个重复的可以,如‘11222333’;

对子和串子可以胡牌,如‘11234678’,就判断输入的字符串是否满足这三种情况之一。

代码

感觉华为的机试都需要动动脑筋想一些方法,注重算法和思变能力;第一次参加这种机试,已经长期没有刷过题缺乏训练,时间只有45分钟,一上来没有打开思路,这道题没有做出来。所以,下方代码为考试结束 后写的,没有验证,正好请大家点评。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

	// 麻将

	public String inputString() {
		Scanner scanner = new Scanner(System.in);

		String s = scanner.nextLine();
		scanner.close();

		return s;
	}

	private boolean kezi(List list) {

		if (list.size() == 2) {
			if (list.get(0).equals(list.get(1))) {
				return true;
			} else {
				return false;
			}
		}

		for (int i = 0; i < list.size(); i++) {
			if (i < list.size() - 2) {
				if (list.get(i).equals(list.get(i + 1)) && list.get(i).equals(list.get(i + 2))) {
					list.remove(i);
					list.remove(i);
					list.remove(i);
					return kezi(list);
				}
			} else {
				return false;
			}
		}

		return false;
	}

	private boolean shunzi(List list) {
		if (list.size() == 2) {
			if (list.get(0).equals(list.get(1))) {
				return true;
			} else {
				return false;
			}
		}

		for (int i = 0; i < list.size(); i++) {
			if (i < list.size() - 2) {
				boolean has = false;
				char c1 = list.get(i);

				for (int j = i + 1; j < list.size(); j++) {
					if (c1 == (list.get(j) - 1)) {
						for (int k = j + 1; k < list.size(); k++) {
							if (c1 == (list.get(k) - 2)) {
								has = true;
								list.remove(k);
							}
						}
					}

					if (has) {
						list.remove(j);
						break;
					}
				}
				if (has) {
					list.remove(i);
					return shunzi(list);
				}
			} else {
				return false;
			}
		}

		return false;
	}

	public boolean canFinish(String s) {
		if (s.length() % 3 != 2)
			return false;

		List list1 = new ArrayList<>();
		List list2 = new ArrayList<>();

		for (int i = 0; i < s.length(); i++) {
			list1.add(new Character(s.charAt(i)));
			list2.add(new Character(s.charAt(i)));
		}

		if (kezi(list1)) {
			return true;
		} else if (shunzi(list2)) {
			return true;
		} else {
			return false;
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Main main = new Main();

		if (main.canFinish(main.inputString())) {
			System.out.println("yes");
		} else {
			System.out.println("no");
		}

	}

}

总结

大概的思路就是,先尝试从字符串中把三个一样的(刻子)取出来,然后将这三个去掉再进行迭代,最终如果成功肯定只剩下两张对子;

这种情况下发现不可以胡牌的时候再尝试是不是胡顺子,思路是一样的迭代,就是判断顺子比刻子要麻烦一些。



你可能感兴趣的:(面试,机试)