先上题目

逆置
如图所示,我们该怎么解决这一类问题呢?核心思想就是:逆置!!
接下来讲讲怎么操作
假如我们是数组是 1 2 3 4 5 6,我们要进行进行你指3个元素。即逆置后数组就变成了4 5 6 1 2 3
具体有三个步骤
1.把前三个元素进行逆置,也就是把1 2 3进行逆置,逆置完变成了3 2 1
2.把后三个元素进行逆置,也就是把4 5 6进行逆置,逆置完变成了6 5 4
3.把整个数组元素进行逆置。基于以上的基础,目前的数组变成了3 2 1 6 5 4,把整个数组逆置完就变成了
4 5 6 1 2 3
接下来,博主为大家讲解逆置函数,大家只要套这个模板就好了
逆置就是最左边和最右边的交换,倒数第二和正数第二进行交换,一次类推。所以我们定义left和right变量,让left指向最左端,right指向最右端,然后每次都是left的值和right的值进行交换(这里需要定义中间变量)(为什么需要定义中间变量,后面我会举例子说明)然后再让left++,同时right–,是不是很妙?这样就可以让整数第二个和倒数第二个元素交换。
void reverse(int * nums,int left,int right)
{
while(left<right)//left肯定不能超过right,大于或等于就得跳出循环
{
int tmp = nums[left];
nums[right] = tmp;
nums[left] = nums[right];
right--;
left++;
}
}
逆置为什么要定义中间变量?
就好比你面前就两杯水。a杯子里面装着果汁,b杯子里面装着酒。那么我们如何做到让a杯子里面装着酒,b杯子里面装着果汁呢?你总不能直接让a杯子里的东西直接倒到b杯子里吧?所以,我们需要拿来一个空杯子(也就是我们代码中的中间变量tmp),先让a杯子里的果汁倒入空杯子中,这样a杯子里面就是空的了,这样再让b杯子里的酒倒入到a杯子中,这样a被里面装的就是酒了,再把空杯子里面先前的果汁倒入到b杯子里,这样b杯子里面装的就是果汁了。
这,就实现了互换!!!
代码示例
假设我们现在的数组为nums[6] = {1,2,3,4,5,6},轮转的个数为k=3次,即轮转的结果为{4 ,5, 6,1,2,3};
上代码
void reverse(int *nums,int left,int right)
{
while(left<right)
{
int tmp = nums[left];
nums[right] = tmp;
nums[left] = nums[right];
left++;
right--;
}
}
void rota(int *nums,int k,int numsSize)//numsSize为元素个数
{
//现在需要定义逆置函数,即上方的reverse
reverse(0,numsSize-k);//先逆置前k个元素
reverse(k,numsSize-1);//后逆置后numsSize-k个元素
reverse(0,numsSize-1);//逆置整个数组
}
自此,我们的轮转数组操作就已经圆满完成了。
4344

被折叠的 条评论
为什么被折叠?



