美图笔试算法题(两个人拿石头判断输赢)
剛做完美圖的筆試,兩道編程題,第一道比較簡單:找出一串用逗號隔開的字符串中不重復的那個數。
以下是第二道,時間有限,很多地方沒來得及優化,整體邏輯應該沒錯。
question:
You are playing the following Nim Game with your friend: There is a heap of stones on the table, each time one of you take turns to remove 1 to 3 stones. The one who removes the last stone will be the winner. You will take the first turn to remove the stones.
Both of you are very clever and have optimal strategies for the game. Write a function to determine whether you can win the game given the number of stones in the heap. True for win and false for lose.
For example, if there are 4 stones in the heap, then you will never win the game: no matter 1, 2, or 3 stones you remove, the last stone will always be removed by your friend.
?
解:
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int sum = scanner.nextInt();//一開始我拿的三種狀況if (chance(sum,1,1)) {System.out.println(true);}else if (chance(sum,2,1)) {System.out.println(true);}else if (chance(sum,3,1)) {System.out.println(true);}else {System.out.println(false);}}/*** * @param surplus 剩余的石頭數量* @param take_num 這一次拿走的數量* @param people 1代表是我,2代表是朋友* @return 返回true,則表示我能贏*/private static boolean chance(int surplus,int take_num,int people) {surplus = surplus-take_num;//當某人拿完,剩余四塊時,該人贏if (surplus==4) {if (people==1) {return true;}else {return false;}}//當某人拿完,剩余數小于4塊時,另一個人贏if (surplus<=3) {if (people==1) {return false;}else {return true;}}//此時剩余的石頭大于4,繼續拿if (people==1) {//交換人people = 2;//如果是朋友拿,則必須三個trueif (chance(surplus,1,people)) {if (chance(surplus,2,people)) {if (chance(surplus,3,people)) {return true;}else {return false;}}else {return false;}}else {return false;}}else {people = 1;//如果是我拿,則只需有一個true即可if (chance(surplus,1,people)) {return true;}else if (chance(surplus,2,people)) {return true;}else if (chance(surplus,3,people)) {return true;}else {return false;}}} }?
轉載于:https://www.cnblogs.com/red-code/p/6720114.html
總結
以上是生活随笔為你收集整理的美图笔试算法题(两个人拿石头判断输赢)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 170405、java版MD5工具类
- 下一篇: 引用与指针区别