不需要第三变量,实时交换数据
来源:互联网 发布:网络女歌手排行榜 编辑:程序博客网 时间:2024/06/05 18:44
深入理解计算机系统第二章P34页练习题
- void inplace_swap(int *x,int *y)
- {
- *x = *x ^ *y;
- *y = *x ^ *y;
- *x = *x ^ *y;
- }
在深入理解计算机系统中有这样的一道习题,也是常见的面试题目,即不用第三个变量,实时交换二个数的值。上面代码是其实现其方法,但接下来提出了如下一个问题,如这个函数的基础上,实现将一个数组中元素头尾两端依次对调。这个函数实现起来比较简单,通过inplace_swap()这个函数把第1元素与最后一个元素对换,依此类推。书上给出如下的代码。
- void reverse_array(int a[], int cnt)
- {
- int first,last;
- for (first = 0,last = cnt - 1;
- first <= last; first++,last-- )
- {
- inplace_swap(&a[first], &a[last]);
- }
经过测试,如果数组元素为偶数个,其结果正确,如果数组个数为奇数个,则得到中间的元素为0。
看到这里,我想到for语句中的判断条件应该改为first < last;奇数个的话就没有必要交换了。但随后又想,就算是要判断,把二个数自己交换自己,应该得到的结果也是正确的啊??????
自己用手写了一下,觉得也应该是正确的,但我认为这书不会犯这样的低级错误,于是自己写了个简单程序测试了一下。
- include <stdio.h>
- #include <stdlib.h>
- void inplace_swap(int *x,int *y)
- {
- *x = *x ^ *y;
- *y = *x ^ *y;
- *x = *x ^ *y;
- }
- int main(void)
- {
- int a = 3;
- int b = 3;
- int c = 3;
- inplace_swap(&a,&b);
- printf("%d,%d/n",&a,&b);
- // inplace_swap(&c,&c);
- // printf("%d/n",c);
- return 0;
- }
得到的结果是:
3,3
0
验证了书上所说的是正确的,这时我自己想了想如果自己与自己交换,则每次都是从同一个地址中取值,如*x = *x ^ *y;x所指地址的值为0,即y所指的址址中的值也为0,所以接下来的运算肯定得到结果都为0;而如果是取二个值相同但是不同的变量来交换的话,还是满足条件的。
虽然只是一个小问题,但这个小问题反应出一个人的基本功。看样子,我的内功急需加强,每天前进一小步,几年后就是一大步,加油。
- 不需要第三变量,实时交换数据
- php不需要第三个中间变量来实现两个变量的交换
- 不添加第三个变量交换两个变量的数据
- 不需要第三个变量交换两个变量值的两种方法
- 不使用第三变量交换两个数值型数据
- 如何不使用第三个变量进行数据交换?
- 不使用第三个变量来交换连个数据
- 两个数交换算法(不需要临时变量)
- 两个数交换算法(不需要临时变量)
- 对两个变量的数据进行互换。不需要第三方变量。(Java知识点小面试)
- 耐人寻味的数值类数据交换:不使用第三方变量进行数据交换
- Java不使用第三个变量交换两个变量的数据
- 交换两个变量而不用第三变量
- 交换2个变量,不通过第三变量
- 不用设置第三变量,交换两个变量
- 不用第三个变量交换两个变量
- 不用第三个变量交换两个变量
- 嵌入式 ab不需要第三方进行交换值
- 点击AlertDialog的按钮时,不自动关闭对话框
- web3d x3d规范文档 在code.csdn.net的镜像
- Leetcode Two Sum
- Exercise 5.3
- android 请求网络 和 httpclient的使用上传下载
- 不需要第三变量,实时交换数据
- ExtJS拖拽效果
- Linux和Windows搭建Ruby开发环境
- C语言中几种类型所占的字节数
- dump命令找不到的问题
- java 抓取新浪财经网上的股票数据(1)
- 怎么在spring官网上下载spring的jar包, 源代码和文档?
- 字符串反向输出
- Lucene4.5.1之添加索引、更新索引、删除索引、查找数据