要想用活Redis,Lua指令碼是繞不過去的坎
阿新 • • 發佈:2021-02-09
題目要求:
一個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是O(n),空間複雜度是O(1)。
示例1:
輸入:nums = [4,1,4,6]
輸出:[1,6] 或 [6,1]
示例2:
輸入:nums = [1,2,10,4,1,4,3,3]
輸出:[2,10] 或 [10,2]
限制:
2 <= nums.length <= 10000
程式碼實現:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* singleNumbers(int* nums, int numsSize, int* returnSize){
// 先將陣列內的數字相異或,最終得到兩個出現一次的數字相與的結果,其餘重複兩次的數字都相互抵消為0
int ret=0;
int i=0;
int m=0;
int x1=0;
int x2=0;
for(i=0;i<numsSize;i++)
{
ret^=nums[i];
}
// 找出ret在轉化為二進位制進行儲存時,第m位為1
// 按32位儲存進行計算
while (m<32)
{
if(ret&(1<<m))
{
break;
}
else
{
m++;
}
}
// 分離出x1與x2
for(i=0;i<numsSize;i++)
{
if(nums[i]&1<<m)
{
x1^=nums[i];
}
else
{
x2^ =nums[i];
}
}
int* returnArr = (int*)malloc(sizeof(int*) * 2);
returnArr[0]=x1;
returnArr[1]=x2;
*returnSize = 2;
return returnArr;
}
總結:
三部曲解這道題目: