交换数组两个数位置方法
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 };
如果要求上一个序列,则是找最长的递减数组。其他分析都差不多。
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 };
以上是关于交换数组两个数位置方法的主要内容,如果未能解决你的问题,请参考以下文章