经典变态面试题——交换两个变量(不创建第三个变量)

发布时间:2024年01月25日

啥如果你面试的时候面试官给你一道题说:“为了让我们的代码定义的变量少之又少,不要出现《屎山代码》,让你写一串代码,不创建第三个变量,从而交换两个变量。”

这时我们肯定会觉得十分简单,交换两个变量简直有手就行~信手拈来的写出来下面的代码:

#include <stdio.h>
int main()
{
	int a = 10;
	int b = 12;
	int temp = 0;
	temp = a;
	a = b;
	b = temp;
	printf("%d %d", a, b);
	return 0;
}

写完后的你还在沾沾自喜,可是面试官却只是邪魅一笑。

检查一番才发现事情不对劲,不知不觉中创建了第三个变量。

绞尽脑汁却只能说出:

?

也许有些聪慧过人的小伙伴已经想到了办法:

#include <stdio.h>
int main()
{
	int a = 10;
	int b = 12;
	a = a + b;
	b = a - b;
	a = a - b;
	printf("%d %d", a, b);
	return 0;
}

?面试官:

咳咳咳,言归正传,虽然该办法可取,但是有一个弊端,如果两个变量的和太大了int放不下,那么还是会出错。

这时候有同学就会出来反对了:用double啊,用long long啊

面试官:?

虽然也没错,但是为了程序的更快捷运行,也为了占用少量的内存,我们便可以通过使用我们接触很少的操作符“^”来解决。

在此之前我们需要明白什么是^(异或)。

异或:异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0^0=0,1^0=1,0^1=1,1^1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。

举个例子:a=11,a的二进制表示为1011,与0101进行^(异或)操作时,变成1110。

当一个数异或本身时,结果为0。即a^a=0。

一个数异或0时,等于它本身。即a^0=a。

了解以上运算规则后就可以开始写代码咯~

#include <stdio.h>
int main()
{
	int a = 10;
	int b = 12;
	b = a ^ b;
	a = a ^ b;//a=a^a^b=b,a^a=0,b^0=b
	b = a ^ b;//b=b^a^b=a
	printf("a=%d b=%d", a, b);
	return 0;
}

?

?

有不足和改进之处欢迎留言评论。

喜欢就一键三连吧~

文章来源:https://blog.csdn.net/CptGhost/article/details/135833585
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。