轮转数组的对称翻转规律
题目描述:
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
解析:
在使用额外辅助数组的情况下,很容易想到取模赋值的方法,也可以在翻转其中寻找规律
例如:
输入: nums = [1,2,3,4,5,6,7], k = 3 输出:[5,6,7,1,2,3,4]解释: 向右轮转 1 步:[7,1,2,3,4,5,6]向右轮转 2 步:[6,7,1,2,3,4,5]向右轮转 3 步:[5,6,7,1,2,3,4]
核心思想就是找到轮转过后nums[0]元素,由此衍生:
step1:将数组转置;
step2:将0~k%numsSize-1之间的元素转置;
step3:将剩下的元素转置;
题解:
void swap(int* a,int* b){ int t=*a; *a=*b; *b=t; } void reverse(int* nums,int start,int end){ while(end>start){ swap(&nums[start],&nums[end]); start++; end--; } } void rotate(int* nums, int numsSize, int k) { reverse(nums,0,numsSize-1); reverse(nums,0,k%numsSize-1); reverse(nums,k%numsSize,numsSize-1); }
借此也回顾用指针方法的交换、双指针下的数组转置

浙公网安备 33010602011771号