Go語言題解LeetCode268丟失的數(shù)字示例詳解
題目描述
原題鏈接 :
給定一個包含 [0, n] 中 n 個數(shù)的數(shù)組 nums ,找出 [0, n] 這個范圍內(nèi)沒有出現(xiàn)在數(shù)組中的那個數(shù)。
示例 1:
輸入:nums = [3,0,1] 輸出:2 解釋:n = 3,因為有 3 個數(shù)字,所以所有的數(shù)字都在范圍 [0,3] 內(nèi)。2 是丟失的數(shù)字,因為它沒有出現(xiàn)在 nums 中。
示例 2:
輸入:nums = [0,1] 輸出:2 解釋:n = 2,因為有 2 個數(shù)字,所以所有的數(shù)字都在范圍 [0,2] 內(nèi)。2 是丟失的數(shù)字,因為它沒有出現(xiàn)在 nums 中。
示例 3:
輸入:nums = [9,6,4,2,3,5,7,0,1] 輸出:8 解釋:n = 9,因為有 9 個數(shù)字,所以所有的數(shù)字都在范圍 [0,9] 內(nèi)。8 是丟失的數(shù)字,因為它沒有出現(xiàn)在 nums 中。
示例 4:
輸入:nums = [0] 輸出:1 解釋:n = 1,因為有 1 個數(shù)字,所以所有的數(shù)字都在范圍 [0,1] 內(nèi)。1 是丟失的數(shù)字,因為它沒有出現(xiàn)在 nums 中。
提示:
n == nums.length
1 <= n <= 10^4
0 <= nums[i] <= n
nums 中的所有數(shù)字都 獨一無二
進階:你能否實現(xiàn)線性時間復雜度、僅使用額外常數(shù)空間的算法解決此問題?
思路分析
拿到這個題目,發(fā)現(xiàn)其是在[0,n]范圍內(nèi)給出n個數(shù)字,也就是說,這個是高度適配將數(shù)組進行排序的想法的。 對于完整的數(shù)組,其排序后應該是一個跟下標值完全一致的數(shù)組集合。 那么解法就很簡單了,尋找第一個跟元素不匹配的下標,其就是缺失的數(shù)字;
AC 代碼
class Solution:
def missingNumber(self, nums: List[int]) -> int:
nums.sort()
for i in range(len(nums)):
if nums[i] != i:
return i
return len(nums)
異或兩遍 - 丟失的數(shù)字
解題思路
異或是一個可交換順序的操作。同一個數(shù)字異或兩遍等于零。
所以我們先求出數(shù)據(jù)的范圍,直接找最大的數(shù)即可。 這里需要注意,如果最大的數(shù)字小于數(shù)組長度,則缺失的數(shù)字是最大的數(shù)字+1。
然后我們對 [0, n] 的所有數(shù)字累計異或一邊,再對數(shù)組中的所有元素也異或一遍,最后就只剩下唯一一個沒有出現(xiàn)的數(shù)字了。因為其他數(shù)字都出現(xiàn)了兩遍。
代碼
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = 0;
int ans = 0;
for (auto num: nums) {
n = max(n, num);
ans ^= num;
}
if (nums.size() > n) n = nums.size();
for (int i = 0; i <= n; i++) {
ans ^= i;
}
return ans;
}
};
C++ 排序二分、加減法、異或 - 丟失的數(shù)字
解題思路:
看到該題第一個想法就是二分法,首先給數(shù)字排序,然后通過mid值判斷在左邊還是在右邊,nums[mid] == mid說明在右邊,否則在左邊,但是最后還要注意缺失的是最后一個數(shù)的情況,那么我們就要根據(jù)最后一個數(shù)進行判斷,再進行返回,代碼如下:
class Solution {
public:
int missingNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
int left = 0, right = nums.size() - 1;
while(left < right) {
int mid = (left + right) / 2;
if(nums[mid] == mid) {
left = mid + 1;
} else {
right = mid;
}
}
return (right == nums.size() - 1 && nums[right] == right) ? right + 1 : right;
}
};
但是顯然沒必要那么復雜,時間效率低,最全局的想法就是把所有下標加起來并且把數(shù)組都減去,剩下的就是丟失的數(shù)字,代碼如下:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int total = 0;
int i;
for(i = 0; i < nums.size(); i ++) {
total += i;
total -= nums[i];
}
total += i;
return total;
}
};
異或的方法其實和加減方法實現(xiàn)方式一樣,只是底層原理不同罷了,思路都是抵消掉相同的,留下唯一一個單獨的,代碼如下:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int total = 0;
int i;
for(i = 0; i < nums.size(); i ++) {
total ^= i;
total ^= nums[i];
}
total ^= i;
return total;
}
};
以上就是Go語言題解LeetCode268丟失的數(shù)字示例詳解的詳細內(nèi)容,更多關(guān)于go題解丟失數(shù)字示例的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語言開發(fā)框架反射機制及常見函數(shù)示例詳解
這篇文章主要為大家介紹了Go語言開發(fā)框架反射機制及常見函數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09
詳解Golang time包中的time.Duration類型
在日常開發(fā)過程中,會頻繁遇到對時間進行操作的場景,使用 Golang 中的 time 包可以很方便地實現(xiàn)對時間的相關(guān)操作,本文講解一下 time 包中的 time.Duration 類型,需要的朋友可以參考下2023-07-07

