- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。找出这两个数字。
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。找出这两个数字。
相同的数异或结果为零,零和任何数异或结果仍为那个数,所以将所有数依次异或,其中成对的将变为零,最终结果是只出现一次的两个数相异或的值。
假设这两个数为 x 和 y ,
result = x ^ y ,
position则是result的二进制形式下为1的位中最高的那一位,这一位即是 x 与 y 的二进制形式相异的位中最高的那一位,
依据这一位为 0 或为 1 将原数组分成两组,x 与 y 必然各自在其中一组,依次异或组内的数,原数组中相同的数必然成对的出现在某一组中,异或是他们为零,最终留下来的数就是组中只有一个的数,即 x 或是 y 。
void find_num(int* arr, int size)
{
int i = 0;
int result = 0;
int position = 0;
int x = 0;
int y = 0;
for (i = 0; i < size; ++i)
{
result ^= arr[i];
}
for (i = 0; i < 32; ++i)
{
if (result & (1 << i))
{
position = i;
}
}
for (i = 0; i < size; ++i)
{
if (arr[i] & (1 << position))
{
x ^= arr[i];
}
else
{
y ^= arr[i];
}
}
printf("%d\t%d\n", x, y);
}
- 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少瓶汽水
循环实现,思路是手里有空瓶就优先用空瓶换,sum变量累加喝的汽水瓶数,bottle则是手中的空瓶数,money是剩余的钱数。
注意一点是两个空瓶换一瓶汽水后,bottle减2再加1,换来的那瓶喝完了手里就又多一个瓶子。
换到最后没钱了,手里也只剩一个空瓶子,循环结束,其实这里如果老板愿意借你一个空瓶,就可以再喝一瓶了!!!
int main()
{
int money = 20;
int bottle = 0;
int sum = 0;
while (money > 0 || bottle == 2)
{
if (bottle == 2)
{
++sum;
bottle = 1;
continue;
}
++sum;
--money;
++bottle;
}
printf("%d\n", sum);
system("pause");
return 0;
}