在完成关于数组的大量算法中,基本都会涉及到元素交换,比如排序中是最常见的,一般的方法是新建一个临时变量,然后完成交换,如果给定的数组中元素是有范围的,其实还有其他方法也可以完成交换。下面就来总结一下这些方法。

临时变量法

临时变量法是最简单的,这个不过多解释。试用任何类型的元素交换。

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

异或法

异或运算是针对具体的每一个位相同为0,不同为1,即1^1 = 0, 0^0 = 0, 1^0 = 1, 0^1 = 1
所以对于任何整数x有x^x = 0, x^0 = x ,且运算满足结合律。所以可以用如下方法完成交换。

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

但是这里有个问题,如果要交换的是同一个位置,即i = j, 上面代码会有问题,a[i] = a[i] ^ a[j] = 0,此后a[i] = a[j] = 0,不管传入时a[i] 等于多少,最后都等于0了。所以改进方案是交换前先判断i和j是否相等,如果不想等才交换。改进代码如下:

public static void swap(int[] a, int i, int j){if(i != j){a[i] = a[i] ^ a[j];a[j] = a[i] ^ a[j];a[i] = a[i] ^ a[j];}
}

加减法

可以先把要交换的两个数相加,然后分别减去对方的值,也能完成交换。这里有个问题,a[i]+a[j] 有可能会越界,但是实际测试就算真的越界,还是能完成交换,可以用实际数据测试一下。

public static void swap(int[] a, int i, int j){a[i] = a[i] + a[j];a[j] = a[i] - a[j]; // a[j] = a[i] + a[j] - a[j]a[i] = a[i] - a[j]; // a[i] = a[i] + a[j] - a[i]
}

乘除法

既然可以用加减法,乘除法也是可以一试的,先把两个数相乘,然后分别除以对方,就能完成交换。这里也会有问题,a[i] * a[j]也可能出现越界情况,但是实测也能得到正确结果。关键乘除法还有一个重大问题,a[i]和a[j]不能等于0,所以此方法不推荐使用。

public static void swap(int[] a, int i, int j){a[i] = a[i] * a[j];a[j] = a[i] / a[j];a[i] = a[i] / a[j];
}

总结

不申请临时变量的方法感觉高大上,但是每种方法总会有一些问题,所以为了保证少出问题,尽量还是使用第一种简单的申请临时变量法吧,这里列出这些方法,主要是为了开阔思维,了解更多的运算逻辑。

数组中交换元素的几种方法总结相关推荐

  1. php 从数组里删除元素,PHP从数组中删除元素的四种方法实例

    PHP从数组中删除元素的四种方法实例 一.总结 一句话总结:unset(),array_splice(),array_diff(),array_diff_key() 二.PHP从数组中删除元素的四种方 ...

  2. java删除数组中重复元素的几种方法

    Java操控数组,删除数组中所有的重复元素,使其数组元素全部唯一,有以下几种方法: 1,使用set(最好想到),set本身就是不重复的集合: package Array_test;import jav ...

  3. Js中去除数组中重复元素的几种方法

    方法1: 1 Array.prototype.method1=function(){ 2 var arr=[]; 3 for(var i=0;i<this.length;i++){ 4 if(a ...

  4. php 如何清空数组_PHP从数组中删除元素的四种方法实例

    删除一个元素,且保持原有索引不变 使用 unset 函数,示例如下: $array = array(0 => "a", 1 => "b", 2 =& ...

  5. python去重复排序_Python实现删除排序数组中重复项的两种方法示例

    本文实例讲述了Python实现删除排序数组中重复项的两种方法.分享给大家供大家参考,具体如下: 对于给定的有序数组nums,移除数组中存在的重复数字,确保每个数字只出现一次并返回新数组的长度 注意:不 ...

  6. JS数组移除元素的八种方法

    JS数组移除元素的八种方法 一.修改arr的length方法 let arr = [1,2,3,4,5,6,7,8,9]; arr.length = 3; console.log('length',a ...

  7. 详解JavaScript数组过滤相同元素的5种方法

    详解JavaScript数组过滤相同元素的5种方法:https://www.jb51.net/article/114490.htm 转载于:https://www.cnblogs.com/bydzha ...

  8. 【javascript基础——系列10】js中隐藏元素的几种方法以及代码

    系列文章 [javascript基础--系列1]前端页面ajax连接后台服务器传输数据 [javascript基础--系列2]前端页面axios连接后台服务器传输数据 [javascript基础--系 ...

  9. (js)删除数组中某个元素的几种方式

    (js)删除数组中某个元素的几种方式 filter 删除删除数组中某个指定元素 //过滤出item.srcConcept != this.vertex的对象 this.edit.conceptData ...

最新文章

  1. 事件绑定在IE下this是window的问题
  2. 【转录组】如何进行序列比对?
  3. 日志库 winston 的学习笔记 - logger.info 的实现原理单步调试
  4. mysql union后面查不出_mysql – 多个UNION查询不起作用
  5. 分支定义之Trunk vs Master
  6. 技术总结:图算法、开源工具及其在工业界的应用场景概述
  7. 常见web攻击方式与防御方法
  8. 六步搞定RHEL5下的mysql镜像数据库配置
  9. HDOJ1020 Encoding
  10. GDAL C#版本 安全透明方法问题解决方案
  11. DELPHI学习---简单类型
  12. ubuntu 14.04 設定hostname
  13. 影牛社区短视频影视APP源码
  14. 7-设计模式之行为模式(模板方法、策略、命令、责任链)
  15. 遥感影像几何校正方法
  16. 苹果手机编辑word_苹果手机自带了三个PDF功能!每一个都这么好用!你知道几个呢?...
  17. 信息学奥赛一本通 1336:【例3-1】找树根和孩子
  18. win10计算机不显示usb,win10插入U盘不显示怎么办_解决win10u盘插电脑上不显示的办法...
  19. 【网络】路由器集成锐捷认证
  20. java opennlp_在java中使用opennlp提取名词短语

热门文章

  1. 捡石头推荐地:三亚天涯海角
  2. findbugs问题解决
  3. 展望未来电力行业发展
  4. 无法将系统配置为计算机,Windows无法将Windows配置为此计算机的硬件上运行
  5. SSL 2295——暗黑破坏神
  6. w ndows 10画图,网友“羞辱”Windows 10界面设计:用画图 10分钟搞定!
  7. 舞界联盟- -现代舞舞蹈教程- -旗袍配花伞,别有一番风味
  8. 一天连续两场活动,唐胡子俱乐部的魅力是什么?
  9. ISCC2021-这是啥
  10. C 库函数 - fread()详解