数组中交换元素的几种方法总结
在完成关于数组的大量算法中,基本都会涉及到元素交换,比如排序中是最常见的,一般的方法是新建一个临时变量,然后完成交换,如果给定的数组中元素是有范围的,其实还有其他方法也可以完成交换。下面就来总结一下这些方法。
临时变量法
临时变量法是最简单的,这个不过多解释。试用任何类型的元素交换。
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];
}
总结
不申请临时变量的方法感觉高大上,但是每种方法总会有一些问题,所以为了保证少出问题,尽量还是使用第一种简单的申请临时变量法吧,这里列出这些方法,主要是为了开阔思维,了解更多的运算逻辑。
数组中交换元素的几种方法总结相关推荐
- php 从数组里删除元素,PHP从数组中删除元素的四种方法实例
PHP从数组中删除元素的四种方法实例 一.总结 一句话总结:unset(),array_splice(),array_diff(),array_diff_key() 二.PHP从数组中删除元素的四种方 ...
- java删除数组中重复元素的几种方法
Java操控数组,删除数组中所有的重复元素,使其数组元素全部唯一,有以下几种方法: 1,使用set(最好想到),set本身就是不重复的集合: package Array_test;import jav ...
- Js中去除数组中重复元素的几种方法
方法1: 1 Array.prototype.method1=function(){ 2 var arr=[]; 3 for(var i=0;i<this.length;i++){ 4 if(a ...
- php 如何清空数组_PHP从数组中删除元素的四种方法实例
删除一个元素,且保持原有索引不变 使用 unset 函数,示例如下: $array = array(0 => "a", 1 => "b", 2 =& ...
- python去重复排序_Python实现删除排序数组中重复项的两种方法示例
本文实例讲述了Python实现删除排序数组中重复项的两种方法.分享给大家供大家参考,具体如下: 对于给定的有序数组nums,移除数组中存在的重复数字,确保每个数字只出现一次并返回新数组的长度 注意:不 ...
- JS数组移除元素的八种方法
JS数组移除元素的八种方法 一.修改arr的length方法 let arr = [1,2,3,4,5,6,7,8,9]; arr.length = 3; console.log('length',a ...
- 详解JavaScript数组过滤相同元素的5种方法
详解JavaScript数组过滤相同元素的5种方法:https://www.jb51.net/article/114490.htm 转载于:https://www.cnblogs.com/bydzha ...
- 【javascript基础——系列10】js中隐藏元素的几种方法以及代码
系列文章 [javascript基础--系列1]前端页面ajax连接后台服务器传输数据 [javascript基础--系列2]前端页面axios连接后台服务器传输数据 [javascript基础--系 ...
- (js)删除数组中某个元素的几种方式
(js)删除数组中某个元素的几种方式 filter 删除删除数组中某个指定元素 //过滤出item.srcConcept != this.vertex的对象 this.edit.conceptData ...
最新文章
- 事件绑定在IE下this是window的问题
- 【转录组】如何进行序列比对?
- 日志库 winston 的学习笔记 - logger.info 的实现原理单步调试
- mysql union后面查不出_mysql – 多个UNION查询不起作用
- 分支定义之Trunk vs Master
- 技术总结:图算法、开源工具及其在工业界的应用场景概述
- 常见web攻击方式与防御方法
- 六步搞定RHEL5下的mysql镜像数据库配置
- HDOJ1020 Encoding
- GDAL C#版本 安全透明方法问题解决方案
- DELPHI学习---简单类型
- ubuntu 14.04 設定hostname
- 影牛社区短视频影视APP源码
- 7-设计模式之行为模式(模板方法、策略、命令、责任链)
- 遥感影像几何校正方法
- 苹果手机编辑word_苹果手机自带了三个PDF功能!每一个都这么好用!你知道几个呢?...
- 信息学奥赛一本通 1336:【例3-1】找树根和孩子
- win10计算机不显示usb,win10插入U盘不显示怎么办_解决win10u盘插电脑上不显示的办法...
- 【网络】路由器集成锐捷认证
- java opennlp_在java中使用opennlp提取名词短语