• 交换两个整数的三种方法


    写在最前:注意,在 Java 中参数是值传递,并没有 C 中的地址传递,要测试请使用数组。

    临时变量法

    这个相信大家都知道,刚学编程时应该都会学到这种交换值的方法。

    虽然用了 1 的额外空间,但这是最容易理解,效率也是最高的一种方法。

    public void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
    

    加减法

    先假设a = 1 , b = 2,要交换 a 和 b。

    1. 执行a = a + b,现在 a 就是 a + b。
    2. 执行b = a - b,b 就相当于 a + b - b 等于原来的 a,b 就变成 a 了。
    3. 执行a = a - b,现在 b 就是原来的 a,a 就相当于 a + b - a 就等于原来的 b,a 变成 b 了。
    public void swap(int[] array, int i, int j) {
        array[i] = array[i] + array[j];
        array[j] = array[i] - array[j];
        array[i] = array[i] - array[j];
    }
    

    注意,该方法有溢出的风险。

    异或法

    我们知道,有两条异或性质。

    1. 任何数和 0 异或,都得任何数。
    2. 任何数与自身异或,都得 0。

    在这里,我们就用到了第 2 条,道理和加减法差不多,只是运算变为了异或,而且不会有溢出问题。

    public void swap(int[] array, int i, int j) {
        array[i] = array[i] ^ array[j];
        array[j] = array[i] ^ array[j];
        array[i] = array[i] ^ array[j];
    }
    

    小结

    后两种方法因为需要运算,而异或法又要比加减法好些,比第一种慢点,但没有使用额外空间。

    后两种方法只是用于装逼,看起来很高级的样子,在实际操作中还是使用第一种为好。



    ┆ 然 ┆   ┆   ┆   ┆ 可 ┆   ┆   ┆ 等 ┆ 暖 ┆
    ┆ 而 ┆ 始 ┆   ┆   ┆ 是 ┆ 将 ┆   ┆ 你 ┆ 一 ┆
    ┆ 你 ┆ 终 ┆ 大 ┆   ┆ 我 ┆ 来 ┆   ┆ 如 ┆ 暖 ┆
    ┆ 没 ┆ 没 ┆ 雁 ┆   ┆ 在 ┆ 也 ┆   ┆ 试 ┆ 这 ┆
    ┆ 有 ┆ 有 ┆ 也 ┆   ┆ 这 ┆ 会 ┆   ┆ 探 ┆ 生 ┆
    ┆ 来 ┆ 来 ┆ 没 ┆   ┆ 里 ┆ 在 ┆   ┆ 般 ┆ 之 ┆
    ┆   ┆   ┆ 有 ┆   ┆   ┆ 这 ┆   ┆ 降 ┆ 凉 ┆
    ┆   ┆   ┆ 来 ┆   ┆   ┆ 里 ┆   ┆ 临 ┆ 薄 ┆
  • 相关阅读:
    二分搜索
    中文分词 (机械传统方法 )正向最大匹配
    推荐引擎概述(转自IBM worker)
    linux OS 多线程学习
    FastReport.Net传递报表参数
    MSSQL 2008 镜像的客户端数据库连接字符串
    FastReport.Net自动行高
    ReSharper 8.0开发版 ReSharper 8.0 Early Access
    客户端FastReport.Net默认界面语言
    ReSharper 7.0 正式版发布
  • 原文地址:https://www.cnblogs.com/qiu_jiaqi/p/SwapNum.html
Copyright © 2020-2023  润新知