1. 程式人生 > 實用技巧 >LeetCode--1

LeetCode--1

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

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

選出任一x,滿足0 < x < N 且N % x == 0。
用 N - x替換黑板上的數字 N 。
如果玩家無法執行這些操作,就會輸掉遊戲。

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

輸入:2
輸出:true
解釋:愛麗絲選擇 1,鮑勃無法進行操作。
示例 2:

輸入:3
輸出:false
解釋:愛麗絲選擇 1,鮑勃也選擇 1,然後愛麗絲無法進行操作。
public boolean divisorGame(int N) {

}

來:現在我來分析一下題目:

輸入 N= 2 愛麗絲先手 輸入 1 -----》(N=2-1)N=1 鮑勃入手 沒法操作。。。。。愛麗絲贏了。

輸入N= 3 愛麗絲先手 輸入 1 -----》(N=3-1)N=2 鮑勃入手 輸入 1 (N=2-1)N=1 愛麗絲入手 沒法操作。。。。。鮑勃贏了。

輸入N= 4 愛麗絲先手 輸入 1 -----》(N=4-1)N=3 鮑勃入手 輸入 1 (N=3-1)N=2 愛麗絲入手 輸入 2/1 ,鮑勃無法入手。

數學角度:如果一直輸入1 來獲取勝利:那麼雙數一定是愛麗絲贏,單數一定是鮑勃贏

第一種解法就簡單了:

 public boolean
divisorGame(int N) { retrun N %2==0; }

另一個方法是動態規劃:

public boolean divisorGame(int N) {
        //動態規劃
        boolean[] dp = new boolean[N+1];
        //初始給定,預設全部是false;
        //【false,false ,false,false,false】;
        dp[1] = false;

        for(int i=2; i<=N; i++){

            for(int
x=1; x<i; x++){ //當第一次 i= 2;x = 1;2 % 1==0->true &&& dp[2-1]==false-->true;====>【false,false,true ,false,false】; //當第二次 i= 3;x = 1; 3 % 1==0->true &&& dp[3-1]==false--->false;====>不執行【false,false,true ,false,false】; //當第三次 i= 3;x = 2; 3 % 2==0->false &&& dp[3-2]==false--->true;====>不執行; //當第三次 i= 4;x = 1; 4 % 1==0->true &&& dp[4-1]==false--->true;====>執行【false,false,true,flase,true】; if(i % x==0 && dp[i-x]==false){ dp[i]=true; break; } } } return dp[N]; }

二:給定一個字串,請你找出其中不含有重複字元的 最長子串 的長度。

示例 1:

輸入: "abcabcbb"
輸出: 3
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。

示例 2:

輸入: "bbbbb"
輸出: 1
解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。

示例 3:

輸入: "pwwkew"
輸出: 3
解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。

 public int lengthOfLongestSubstring(String s) {
        int len = 0;
        // 視窗起始位置
        int start = 0;
        for (int cur = 1; cur < s.length(); cur++) {
            // 拿到每個當前指標元素來從視窗起始位置遍歷來判斷是否已存在該元素
            for (int i = start; i < cur; i++) {
                if (s.charAt(i) == s.charAt(cur)) {
                    // 存在擷取長度
                    len = Math.max(len, cur - start);
                    // 視窗起始點變成出現重複第一個元素的後面
                    start = i + 1;
                    // 跳出檢查
                    break;
                }
            }
        }
        // 最後比較最大長度和遍歷完視窗的長度
        return Math.max(s.length() - start, len);




    }