【Leetcode136-只出現一次的數字 Single Number】(c語言)
阿新 • • 發佈:2018-12-26
目錄
只出現一次的數字
給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?
示例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; }