zoukankan      html  css  js  c++  java
  • careercup-中等难题

    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=1;
        int b=2;
        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;
    }
  • 相关阅读:
    【故障处理】ORA-12162: TNS:net service name is incorrectly specified (转)
    android studio 编程中用到的快捷键
    java时间格式串
    android Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine.
    linux安装vmware
    x1c 2017 安装mint18的坑——grub2
    x1c2017 8G版 win linux的取舍纠结记录
    python的try finally (还真不简单)
    kafka+docker+python
    json文件不能有注释
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4158389.html
Copyright © 2011-2022 走看看