1. 程式人生 > >【Leetcode136-只出現一次的數字 Single Number】(c語言)

【Leetcode136-只出現一次的數字 Single Number】(c語言)

目錄

測試單元

題目分析

優化版

只出現一次的數字

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

說明:

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

示例1:

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

示例2:

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

測試單元

(養成先寫測試用例的習慣)滿足題目測試用力中只有一個只出現一次的數字(如題目給出的示例)

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int nums1[3] = { 2, 2, 1 };
	int nums2[5] = { 4, 1, 2, 1, 2 };
	int result1 = singleNumber(nums1, 3);
	int result2 = singleNumber(nums2, 5);
	printf("%d,%d", result1, result2);
	system("pause");
	return 0;
}

題目分析

要找到一組資料中只出現一次即沒有重複的數字(且其他數字只出現兩次),其他數字只出現兩次這個是解題的關鍵,我們可以暴遍歷法,記錄下每個資料出現的次數然後再找到其中只出現一次的數字(這樣做太麻煩了,而且效率不高),我們學過一個運算子(^)它的作用是兩個數的二進位制中的每一個位元位,形同為0,不同則為1.即(1 ^ 1 = 0,50 ^ 50 = 0,0 ^ 100 = 100),那如果將這組資料每一位都^則最後的出的那個結果就是隻出現一次的那個數。

程式碼如下:

優化版

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int singleNumber(int* nums, int numsSize)
{
	int result = nums[0];
	for (int i = 1; i < numsSize; i++)
	{
		result ^= nums[i];
	}
	return result;
}
int main()
{
	int nums1[3] = { 2, 2, 1 };
	int nums2[5] = { 4, 1, 2, 1, 2 };
	int result1 = singleNumber(nums1, 3);
	int result2 = singleNumber(nums2, 5);
	printf("%d,%d", result1, result2);
	system("pause");
	return 0;
}