交换数组两个数位置方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交换数组两个数位置方法相关的知识,希望对你有一定的参考价值。

参考技术A 一,利用splice函数

splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。

语法:arrayObject.splice(index,howmany,item1,.....,itemX),

index: 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。

howmany: 必需。要删除的项目数量。如果设置为 0,则不会删除项目。

item1, ..., itemX: 可选。向数组添加的新项目。

arr[index1] = arr.splice(index2, 1, arr[index1])[0];

首先 删除index2下标的元素,然后添加arr[index1] 到数组index2处,然后splice函数会返回被删除的数,以数组形式返回,[0]就拿到了之前被删除的arr[index2]的值,赋值给arr[index1]。至此交换完成。

二,最最传统的临时变量法。

let t = arr[index2];

arr[index2] = arr[index1];

arr[index1] = t;

三, arr[index1] = [arr[index2],arr[index2]=arr[index1]][0];

简单粗暴,直接把i1的值赋值给i2,i2的值被保存在数组中,最后取到赋值给i1

四,利用ES6的解构,

[a,b] = [b,a]; 非常简单直接写

LC31 Next Permutation

有关排列的题目,如果用DFS去做,就十分低效。这里介绍一种做法:求下一个序列,先从尾部开始找最长的递增数组,如果从尾到头都是递增,则这已经是最大序列,下一个序列就是将最大序列翻转一下。如果不存在递增数组,则将最后两位数交换一下。其他情况,则记录下递增数组的前一位数,并找出递增数组中比这个数大的最小的那个数,交换两个数位置,然后将这个递增数组翻转一下,结果就是下一个序列。网上可以找到相关证明。

技术分享
 1 class Solution {
 2 public:
 3     void nextPermutation(vector<int>& nums) {
 4         if(nums.size()<=1)
 5             return;
 6         int i=nums.size()-1;
 7         while(i>=1&&nums[i-1]>=nums[i])
 8         {
 9             i--;
10         }
11         if(i==0)
12         {
13             reverse(nums.begin(),nums.end());
14         }
15         else if(i==nums.size()-1)
16         {
17             swap(nums[i],nums[i-1]);
18         }
19         else
20         {
21             i--;
22             int j;
23             for(j=nums.size()-1;j>=i;j--)
24             {
25                 if(nums[j]>nums[i])
26                     break;
27             }
28             swap(nums[i],nums[j]);
29             reverse(nums.begin()+i+1,nums.end());
30         }
31     }
32 };
View Code

如果要求上一个序列,则是找最长的递减数组。其他分析都差不多。

技术分享
 1 class Solution {
 2 public:
 3     void prevPermutation(vector<int>& nums) {
 4         if(nums.size()<=1)
 5             return;
 6         int i=nums.size()-1;
 7         while(i>=1&&nums[i-1]<=nums[i])
 8         {
 9             i--;
10         }
11         if(i==0)
12         {
13             reverse(nums.begin(),nums.end());
14         }
15         else if(i==nums.size()-1)
16         {
17             swap(nums[i],nums[i-1]);
18         }
19         else
20         {
21             i--;
22             int j;
23             for(j=nums.size()-1;j>=i;j--)
24             {
25                 if(nums[j]<nums[i])
26                     break;
27             }
28             swap(nums[i],nums[j]);
29             reverse(nums.begin()+i+1,nums.end());
30         }
31     }
32 };
View Code

 

以上是关于交换数组两个数位置方法的主要内容,如果未能解决你的问题,请参考以下文章

javascript随机打乱数组

三大数组排序方法(选择冒泡插入)

C语言笔记|冒泡排序

LC31 Next Permutation

一种在数组中的两个索引之间交换位置的方法[重复]

如何交换数组中的两个整数,其中我的方法从 main 中获取两个整数和一个数组?