LeetCode筆試題 Single Number(找出只出現了一次的元素)

給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

說明:

你的算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 1:

輸入: [2,2,1]
輸出: 1

示例 2:

輸入: [4,1,2,1,2]
輸出: 4

 下面程序是利用unordered_map解問題
 

int singleNumber(vector<int>& nums)
{
	//建立一個無序單重映射表
	unordered_map<int, bool> m;
	//遍歷vec,如果map表中找到當前vec的元素,給value設置標誌位true表示該數字有重複。
	//沒有就將其放入map表中,並且給value設置標誌位false表示該數字目前無重複。
	for (int i = 0; i < nums.size(); ++i)
	{
		if (m.find(nums[i]) != m.end())
		{
			m[nums[i]] = true;
		}
		else
		{
			m[nums[i]] = false;
		}
	}	
	//遍歷map表通過value找key
	for (auto it = m.begin(); it != m.end(); ++it)
	{
		if (!it->second)
		{
			return it->first;
		}
	}
	return -1;
}

int main()
{

	vector<int>num = { 0,0,0,0,1,1,1,1,2,2,2,2,3};
	int i = singleNumber(num);
	cout << i << endl;
	getchar();
	return 0;
}

利用位運算解決問題 

/*  算法思想:巧妙使用位運算解決,根據異或運算的
    性質,將所有數字異或後,相同的數字抵消,剩下
    的數字即爲只出現了一次的數字
*/
int singleNumber(int* nums, int numsSize)
{
	if (nums == NULL || numsSize <= 0)
	{
		return -1;
	}
	int result = 0;
	for (int i = 0; i < numsSize; i++)
	{
		result ^= nums[i];
	}
	return result;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章