LeetCode 260には一度しか現れない数字(超詳細)
LeetCode 260には一度しか現れない数字
LC練習問題 LeetCode 260には一度しか現れない数字 テーマ概要 構想説明 コードセグメントごとに を説明する完全解答
タイトルの簡単な説明
整数配列numsが与えられ、2つの要素が1回しか現れず、残りのすべての要素が2回しか現れない.一度しか現れない2つの要素を見つけます.任意の順序で答えを返すことができます.
ステップアップ:あなたのアルゴリズムは線形時間の複雑さを持つべきです.定数空間の複雑さだけを使って実現できますか?
考え方の説明
コードセグメント別に説明
完全な回答
どこか分からないことがあったらメッセージをください.
LC練習問題
タイトルの簡単な説明
整数配列numsが与えられ、2つの要素が1回しか現れず、残りのすべての要素が2回しか現れない.一度しか現れない2つの要素を見つけます.任意の順序で答えを返すことができます.
ステップアップ:あなたのアルゴリズムは線形時間の複雑さを持つべきです.定数空間の複雑さだけを使って実現できますか?
考え方の説明
, nums,
, 。
, , 。
,
( , )。
, ,
, 。
,
, , ,
, 。 , 。
コードセグメント別に説明
// ,
//
int i = 0;
int ret = 0;
for (i = 0;i < numsSize;i++)
{
ret ^= nums[i];
}
// , 1 1
// 1
int m = 0;
while (((ret >> m) & 1) != 1)
{
m++;
}
1 ?
, 1
?
, , ,
1 1 ,
, 。
// m 1
// m 0
// m 1
// m 0
int x1 = 0;
int x2 = 0;
for (i = 0;i < numsSize;i++)
{
if ((nums[i] >> m) & 1)
{
x1 ^= nums[i];
}
else
{
x2 ^= nums[i];
}
}
完全な回答
int* singleNumber(int* nums, int numsSize, int* returnSize)
{
//
int i = 0;
int ret = 0;
for (i = 0;i < numsSize;i++)
{
ret ^= nums[i];
}
// 1
int m = 0;
while (((ret >> m) & 1) != 1)
{
m++;
}
// m 1
// m 0
int x1 = 0;
int x2 = 0;
for (i = 0;i < numsSize;i++)
{
if ((nums[i] >> m) & 1)
{
x1 ^= nums[i];
}
else
{
x2 ^= nums[i];
}
}
int* RetArr = (int*)malloc(sizeof(int) * 2);
RetArr[0] = x1;
RetArr[1] = x2;
*returnSize = 2;
return RetArr;
}
どこか分からないことがあったらメッセージをください.