欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

面试题-(不创造第三个变量,实现两个数的交换)-C语言

时间:2023-04-29

开篇:在之前的一道出自(品茗股份)的笔试题相信大家不是很陌生了吧,在这里我们来再次回想一次这道题的做法:
题目:交换两个int变量的值,不能使用第三个变量,即a=5,b=3,交换之后a=5,b=3;
对你没看错,题目就是这么简单明了,有陷阱吗?—我想是没有的,但是如果你是当时笔试的同学,我猜你也不一定做得出!哈~
假设思想:我们在这里做一个假设,假设没有中间不允许创造第三个变量的规矩(就这样想想,我的规矩就是我的规矩)
我想大多数同学都跟我一样,简单嘛,没有条件限制了,直接上手写一个交换函数,完成了这次漂亮的交换—so easy

#define _CRT_SECURE_NO_WARNINGS 1#includevoid Swap(int* x, int* y)//实现这个交换函数(用指针来接受){int tmp = 0;//定义一个中间变量交换两个值tmp =*x;*x = *y;*y = tmp;}int main(){int a = 5;//题目给定的变量值int b = 3;printf("exchange before a=%d b=%dn", a, b);//交换之前的值打印一下Swap(&a, &b);//写一个交换函数,将a,b的地址传递上去(注意传值是不能改变main函数内部的值的)printf("exchange after a=%d b=%dn", a, b);//交换之后的值进行打印return 0;}

呐,你要的运行结果!
OK!一个小小的交换函数就被我们搞定了–等等不是说不能创造第三变量嘛—是哦
接下来再跟着看-这里我们试着用加减法来做一下,能不能解决问题
加减法解题思路:
(1):先将a与b相加之和的值赋值给a
(2):交换后的b计算方法:就是要得到原来的a嘛,就用相加之和的值减去b就行,此时的b就等于交换之前的a了
(3):交换后的a计算方法:用(1)中的相加之和减去(2)中的b,就得到交换之前的b了
举个实例来看:

这样是不是更加清楚一点了!(别废话了,赶紧写代码吧–额,好!~) 

#define _CRT_SECURE_NO_WARNINGS 1#includeint main(){int a = 5;int b = 3;printf("exchange before a=%d b=%dn", a, b);//交换之前的值打印一下a = a + b;b = a - b;a = a - b;printf("exchange after a=%d b=%dn", a, b);//交换之后的值进行打印}

运行的结果也是一样的!

 Ok!交换成功-搞定(啥,你要交接很大的数,还有负数,抱歉我这个代码可管不了了这么多哦,自己想办法改进)
好吧好吧,搞不定,那再给你介绍一种方法:
异或法:
(1):都学过异或(^)这个操作符吧
就是其实每个数字都是由32个bite位组合而成
异或就是利用bite位 相同为0,相异为1
(2):多说无益,看思路:
首先将a,b的值异或到a上,
想得到交换后的b:就用异或好的a与之前的b异或,就得到之前的a了,(同理这样得交换后的a)
手撕bite位给你们看:

思路都懂了吧,上手写代码:

#define _CRT_SECURE_NO_WARNINGS 1#includeint main(){int a = 5;int b = 3;printf("exchange before a=%d b=%dn", a, b);//交换之前的值打印一下a = a ^ b;b = a ^ b;a = a ^ b;printf("exchange after a=%d b=%dn", a, b);//交换之后的值进行打印return 0;}

 运行结果也是一样的啦~ Ok 这样才是真正的搞定哦!

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。