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.
留言
張貼留言