1. 程式人生 > 其它 >執行緒池提交執行任務中execute()方法和submit()的區別

執行緒池提交執行任務中execute()方法和submit()的區別

題幹

愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。

最初,黑板上有一個數字 N 。在每個玩家的回合,玩家需要執行以下操作:

選出任一 x,滿足 0 < x < N 且 N % x == 0 。

用 N - x 替換黑板上的數字 N 。

如果玩家無法執行這些操作,就會輸掉遊戲。

只有在愛麗絲在遊戲中取得勝利時才返回 True,否則返回 False。假設兩個玩家都以最佳狀態參與遊戲。

示例 1:

輸入:2

輸出:true

解釋:愛麗絲選擇 1,鮑勃無法進行操作。

示例 2:

輸入:3

輸出:false

解釋:愛麗絲選擇 1,鮑勃也選擇 1,然後愛麗絲無法進行操作。

提示:

1 <= N <= 1000

來源:力扣(LeetCode)

連結:https://leetcode-cn.com/problems/divisor-game

思路

方法一,用數學歸納法,找規律。

N=1,false

N=2,true

N=3,false

……

發現奇數false,偶數true

public boolean divisorGame(int N) {
  if(N%2==0){
    return true;
  }
  else{
    return false;
  }
}

方法二,動態規劃

用dp陣列來記錄各個N值時,愛麗絲是否贏得了勝利

本題的狀態轉移方程的思路如下

把每個N的因子與它本身進行除法,根據題意,兩人都是最佳狀態。因此但凡有一個因子相除以後的狀態下是愛麗絲因的勝利,則她一定會選擇使自己獲勝的銀子,則可以記錄為1,否則記錄為0

class Solution {
    public boolean divisorGame(int N) {
        /*
        dp[n]=1表示愛麗絲獲勝
        dp[n]=0表示愛麗絲失敗
        */
        int[] dp=new int[N+1];
        if(N==1){
            dp[1]=0;
        }
        else if(N==2){
            dp[1]=0;
            dp[2]=1;
        }
        else if(N>=3){
            dp[
1]=0; dp[2]=1; for(int i=3;i<=N;i++){ // dp[i]=-1; for(int j=1;j<=i/2;j++){ if(i%j==0){//如果i被j被整除 if(dp[i-j]==1&&dp[i]!=1){ dp[i]=0; } else if(dp[i-j]==0){ dp[i]=1; } } } } } if(dp[N]==0){ return false; } else if(dp[N]==1){ return true; } return false; } }