首页 > 其他分享 >每日一面—— 不使用任何中间变量如何将a、b的值进行交换

每日一面—— 不使用任何中间变量如何将a、b的值进行交换

时间:2024-07-24 16:01:35浏览次数:12  
标签:swap2 变量 int 每日 交换 a1 b1 运算

请参考以下C++程序代码。

1 #include <stdio.h>
2
3 void swap1(int& a, int& b)
4 {
5  int temp = a; //使用局部变量temp完成交换
6  a = b;
7  b = temp;
8 };
9
10 void swap2(int& a, int& b)
11 {
12  a=a+b; //使用加减运算完成交换
13  b=a-b;
14  a=a-b;
15 };
16
17 void swap3(int& a, int& b)
18 {
19  a^=b; //使用异或运算完成交换
20  b^=a;
21  a^=b;
22 };
23
24 int main(void)
25 {
26  int a1 = 1, b1 = 2;
27  int a2 = 3, b2 = 4;
28  int a3 = 5, b3 = 6;
29  int a = 2147483647, b = 1;
30
17 void swap3(int& a, int& b)
18 {
19  a^=b; //使用异或运算完成交换
20  b^=a;
21  a^=b;
22 };
23
24 int main(void)
25 {
26  int a1 = 1, b1 = 2;
27  int a2 = 3, b2 = 4;
28  int a3 = 5, b3 = 6;
29  int a = 2147483647, b = 1;
30
31  swap1(a1, b1); //测试使用临时变量进行交换的版本
32  swap2(a2, b2); //测试使用加减运算进行交换的版本
33  swap3(a3, b3); //测试使用异或运算进行交换的版本
34
35  printf("after swap...\n");
36  printf("a1 = %d, b1 = %d\n", a1, b1);
37  printf("a2 = %d, b2 = %d\n", a2, b2);
38  printf("a3 = %d, b3 = %d\n", a3, b3);
39
40  swap2(a, b);
41  printf("a = %d, b = %d\n", a, b);
42
43  return 0;
44 }

以上程序中有3个swap函数,都是采用引用传参的方式。

swap1()采用的是我们在许多教科书里看到的方式,用一个局部变量temp 保存其中一个值来达到交换目的。当然,这种方式不是本题要求的答案。

swap2()采用的是一种简单的加减算法来达到交换a、b 的目的。这种方式的缺点是做a+b和a-b运算时可能会导致数据溢出。

swap3()采用了按位异或的方式交换a、b。按位异或运算符“^”的功能是将参与运算的两数各对应的二进制位相异或,如果对应的二进制位相同,则结果为0,否则结果为1。这样运算3次即可交换a、b的值。

代码第31~32行做了调用3种swap函数的举例,注意第40行的调用,这里在swap2函数栈中的运算会有数据溢出发生。我们知道,在32位平台下,int占4个字节内存,其范围是-2147483648~2147483647,因此2147483647加1就变成了-2147483648。不过通过运行结果我们可以看到,虽然产生了溢出,但是交换操作依然是成功的。下面是程序运行结果。

after swap…

a1 = 2, b1 = 1

a1 = 4, b1 = 3

a1 = 6, b1 = 5

a1 = 1, b1 = 2147483647

【答案】

采用程序代码中swap2和swap3的交换方式。swap2有可能发生数据溢出的缺点。相比于swap2,推荐swap3,采用按位异或的方式。

标签:swap2,变量,int,每日,交换,a1,b1,运算
From: https://blog.csdn.net/qq_61802519/article/details/140661473

相关文章

  • 如何从IBM SOAR连接交换在线powershell?
    有谁知道如何从IBMSOAR连接到ExchangeOnlinePowerShell?我一直在阅读Microsoft文档来检查我可以连接的方式,但它们都是通过powershell执行的命令,我想知道这是否是唯一的方式,我必须通过ssh连接并执行命令,或者是否有是另一种方式。是对的,没有直接从IBMSOAR连接到......
  • 邻项交换
    适用的情形是交换两个决策不会对其他决策产生影响,非常有用,真的注意推式子时应尽量拆,移项,减少未知数P1842假设现在决策i和i+1,那么之前答案是\(max(\sum_{j=i+1}^{n}w_{j}-w_{i+1}-s_{i+1},\sum_{j=i+1}^{n}w_{j}-s_{i})\)之后答案是\(max(\sum_{j=i+1}^{n}w_{j}-w_{i+1}+w......
  • 您可以将变量传递到类 __str__ 中以更改输出吗?
    我想将变量传递到str(类内部)以更改其输出。例如:classBasic:def__str__(self,specialCase=False):ifspecialCase==True:return"x"return"y"example=Basic()print(example)#thisprintsy......
  • django 和 celery 中解释 env 变量的差异
    我对带有反斜杠的环境变量有疑问。我有:NETWORK=\\TI\folder但是在Django和Celery中,这个变量将以不同的方式解释:Django:\\TI\folderCelery:\TIfolder为什么我有差异?Celery和Django具有相同的env文件和环境。Python3.8Django和Celery对环境变量......
  • 为什么重新加载后“globals()”中会出现未声明的变量,并且使用它们来识别重新加载是否
    我发现重新加载模块时下面的代码片段test出乎意料地已经在globals()/locals()中定义了所有变量。为什么会发生这种情况?我注意到了这个"xxx"inlocals()模式|||BlenderPython脚本中有很多,因为人们通常使用它来检查模块之前......
  • 2024.7.22每日笔记,有错望指出
    //5、求125之内自然数中偶数之和。#include<stdio.h>intmain(){inti=0;intsum=0;for(i=0;i<=125;i++){if(i%2==0){sum=sum+i;printf("%d\n",sum);}}return0;}//7、编程计算1......
  • JCR一区级 | Matlab实现GA-Transformer-LSTM多变量回归预测
    JCR一区级|Matlab实现GA-Transformer-LSTM多变量回归预测目录JCR一区级|Matlab实现GA-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料效果一览基本介绍1.【JCR一区级】Matlab实现GA-Transformer-LSTM多变量回归预测,遗传优化算法(GA)优......
  • python每日学习:numpy库的用法(上)
    python每日学习10:numpy库的用法(上)下载numpy库pipinstallnumpy检测环境是否安装importnumpyimportnumpyasnpa=np.arange(10)print(a)array创建数组名称描述dtype数组元素的数据类型,可选copy对象是否需要复制,可选order创建数组的样式,C为行方向,F为列方向,A......
  • 代码随想录算法训练营第四天 | Leetcode 24 两两交换链表中的节点 Leetcode 19 删除链
    前言今天链表的内容突出一个注意细节,判空条件,头节点是否为空等等。采用虚拟头节点可以方便链表进行更改,还需要学会使用临时变量。 Leetcode24两两交换链表中的节点题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/代码随想录题解:代码随想录(programmercarl.......
  • 每日一题-P1344
    本来求边数又建了个图跑流,然后看题解发现直接流量置为A*w+1(A为足够大的数)感觉很强#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstintA=1e5;constllinf=1e18;intn,m,s,t;structedge{ intv;llw;intnx;}e[10005];intcnt,hd[205],cur[......