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

文章讲述了在面试中遇到的编程题目,要求不创建第三个变量交换两个整数变量。通过介绍异或运算的概念和特性,提供了一种高效且节省内存的解决方案。
摘要由CSDN通过智能技术生成

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

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

#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;
}

 

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

喜欢就一键三连吧~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值