136. Single Number (Java)




我的概念大概是這樣:
放一個true的flag在旁邊。然後一個數字一個數字從小到大按照順序翻開來看。
如果我看到的目前的數字跟我上一個看到的數字一樣,我就把flag對調。
如果我看到的目前的數字跟我上一個看到的數字不一樣,我先檢查flag。
如果flag是true,代表我前一個看的數字是偶數個,先倒轉flag,但是不需要回傳。
如果flag是false,代表我前一個看的數字是奇數個,就代表前一個數字要回傳。
一直翻到最後一個數字為止,如果都還沒有回傳,則回傳最後一個數字。

假設數列是11122,我在翻到第一個2的時候,我的flag會是false,而且前一個數字是1
所以我會把1回傳。

假設數列是111123333,翻到第一個2的時候flag是true所以我不會做任何動作。但是往下翻到3的時候我會發現我前一個數字是2而且我的flag是false,就回傳2。

程式碼如下:

如果傳進來的陣列長度為1直接輸出第0值
        if(nums.length == 1){return nums[0];}

先把傳進來的nums做從小到大的排序
        java.util.Arrays.sort(nums);

設一個值為true的flag
        Boolean flag = true;

用一個暫時的變數temp存取第0個值
        int temp=nums[0];

掃整個nums,如果當下的數字跟temp是一樣的話,把flag倒轉,然後把temp變成當下的數字。如果當下的數字跟temp不一樣,而且flag為true,就直接回傳前一個數字。如果flag為false,就當沒事,繼續掃。
如果掃到底的話還沒有return的話,就是最後一個數字了,直接輸出最後一個數字。
     ; for(int i=1; i<nums.length; i++){

           if(nums[i]==temp){

               flag = !flag;

               temp = nums[i];

          }else if (nums[i]!=temp){

             if(flag==false){

                    flag = true;

                    temp = nums[i];

              }

              else{

                  return nums[i-1];

              }

          }

      }

      return nums[nums.length-1];

  }

}


Runtime: 10 ms
Your runtime beats 25.29 % of java submissions.

留言

這個網誌中的熱門文章

利用Accuweather實作天氣APP

實作Android導覽教學(fragment)