17.1 编写一个函数,不用临时变量,直接交换两函数。

解法:

方法一:这个是经典面试题,也相当直接。我们将用a0表示a的初值,b0表示b的初始值,用diff表示a0-b0的值。

让我们将a>b的情形绘制在数轴上。

首先,将a设为diff,即上面数轴的右边那一段。然后,b加上diff(并将结果保存在b中),就看得到a0.至此,我们得到b=a0和a=diff。最后,只需将b设为a0-diff,也就是b-a。

方法二:我们还可以用位操作实现类似的解法,这种解法的优点在于它适用的数据类型更多,不仅限于整数。

C++实现代码:

#include<iostream>
using namespace std; void swap(int a,int b)
{
a=a-b;
b=a+b;
a=b-a;
cout<<a<<" "<<b<<endl;
} void swap1(int a,int b)
{
a=a^b;
b=a^b;
a=a^b;
cout<<a<<" "<<b<<endl;
}
int main()
{
int a=;
int b=;
swap(a,b);
swap1(a,b);
cout<<a<<" "<<b<<endl;
}

以上的swap函数,尤其是第2个实现,简洁美观高效,乃居家旅行必备良品。但是, 使用它们之前一定要想一想,你的程序中,是否有可能会让swap中的两个形参引用同一变量。 如果是,那么上述两个swap函数都将出问题。有人说,谁那么无聊去swap同一个变量。 那可不好说,比如你在操作一个数组中的元素,然后用到了以下语句:

swap(a[i], a[j]); // i==j时,出问题

你并没有注意到swap会去操作同一变量,可是当i等于j时,就相当于你这么干了。 然后呢,上面两个实现执行完第一条语句后,操作的那个内存中的数就变成0了。 后面的语句不会起到什么实际作用。

所以如果程序中有可能让swap函数去操作同一变量,就老老实实用最朴素的版本:

void swap(int &a, int &b){
int t = a;
a = b;
b = t;
}

careercup-中等难题的更多相关文章

  1. 面试题目——《CC150》中等难题

    面试题17.1:编写一个函数,不用临时变量,直接交换两个数. 思路:使用差值或者异或 package cc150.middle; public class Exchange { public stat ...

  2. 《程序员面试金典(第5版)》【PDF】下载

    <程序员面试金典(第5版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382252 内容简介 本书作者Gayle Laakma ...

  3. Careercup - Google面试题 - 6283958983589888

    2014-05-06 11:31 题目链接 原题: Find the k-th Smallest Element in Two Sorted Arrays. I followed the algori ...

  4. 深入super,看Python如何解决钻石继承难题 【转】

    原文地址 http://www.cnblogs.com/testview/p/4651198.html 1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通 ...

  5. 探讨webapp的SEO难题(上)

    前言 网络蜘蛛无法解析javascript,至少百度是不能的,神马搜索差的更远,而我们的webapp的渲染展示完全由javascript驱动 所以蜘蛛访问webapp页面会得到一个白页面,比如,我们期 ...

  6. [CareerCup] 18.1 Add Two Numbers 两数相加

    18.1 Write a function that adds two numbers. You should not use + or any arithmetic operators. 这道题让我 ...

  7. [CareerCup] 17.2 Tic Tac Toe 井字棋游戏

    17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏, ...

  8. hduoj 1251 统计难题

    http://acm.hdu.edu.cn/showproblem.php?pid=1251 统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory ...

  9. FZU 1686 神龙的难题 (重复覆盖)

    Problem 1686 神龙的难题 Accept: 397    Submit: 1258Time Limit: 1000 mSec    Memory Limit : 32768 KB  Prob ...

  10. HDU 1251统计难题

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

随机推荐

  1. [2015编程之美] 资格赛C

    #1150 : 基站选址 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 需要在一个N × M的网格中建立一个通讯基站,通讯基站仅必须建立在格点上. 网格中有A个用户,每个 ...

  2. HDU 5288 OO’s Sequence

    题意:给一个序列,函数f(l, r)表示在[l, r]区间内有多少数字不是其他数字的倍数,求所有区间的f(l, r)之和. 解法:第一次打多校……心里还有点小激动……然而一道签到题做了俩点……呜呜呜… ...

  3. Timus 1746 Hyperrook

    题意:在一个n维坐标系中,坐标的范围是0到m - 1,如果两个点坐标只有一个维度的坐标不同则可以相互移动,给出p个点,问任意两个点之间路径为d的个数是多少,答案与p取模. 解法:只需要考虑两个点之间不 ...

  4. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.4.6

    Let $A$ and $B$ be two matrices (not necessarily of the same size). Relative to the lexicographicall ...

  5. [娱乐]GameMaker绘制参数方程的图像

    今天,我翻了旧物,硬着头皮看了这源码.突然恍然大悟,这岂不就是当年学的参数方程! 目前,最早开始教授参数方程实在高三时,并作为一门选修课程,简化了求解圆锥曲线方程的难度,在高考中也很容易拿分,考试过后 ...

  6. jquery选择器返回值

    jquery选择器$('selector')返回的不是数组,而是封装好的jquery对象.但这个对象有一个特别的地方,就是查询到的节点被以下标为属性,添加到了jquery对象上,所以它看起来像数组,因 ...

  7. 【原】Storm调度器

    Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Pluggable scheduler(可插拔调度器) Isolation schedu ...

  8. 609C Load Balancing

    题意: ”平均数“的意思是:最大数和最小数之间的差值为0或1: 先求“平均”数组,再相减. #include<iostream> #include<cstdlib> #incl ...

  9. MFC用PostMessage传递消息

    1.自定义消息ID. #define WM_MY_MESSAGE (WM_USER+100)         WM_USER为windows系统为非系统消息保留的ID,这里至少要用100,因为其它控件 ...

  10. r语言入门资料

    最近有好多r语言的爱好者问我r语言的事情,在百度上简单的收一收,感觉都在扯淡,真正适合初学者入门的资料几乎没有,比如最开始用什么编辑器比较好,在哪下载,最开始学习的例子有什么?  在日本网站上反倒是找 ...