题目:将数组旋转平移k次。
分析:方法一:直接用一个变量保存最末一位,然后每次移一位。
class Solution {
public:
void rotate(int nums[], int n, int k) {
k = k%n;
for (int i = 0; i < k; i++)
{
int temp = nums[n-1];
for (int j = n-1; j >0; j--)
{
nums[j] = nums[j-1];
}
nums[0] = temp;
}
}
};
但是这样效率很低,直接tle。
方法二:新开一个大小为n的数组,将老数组分段copy进去,然后再copy回来。
- void rotate(int nums[], int n, int k) {
- k = k % n;
- if (k == 0) return;
- int *temp = new int[n];
- memcpy(temp, nums+(n-k), sizeof(int)*k);
- memcpy(temp+k, nums, sizeof(int)*(n-k));
- memcpy(nums, temp, sizeof(int)*n);
- delete[] temp;
- }
方法三:三次翻转。
class
Solution {
public
:
void
rotate(
int
nums[],
int
n,
int
k) {
if
(n <=
1
){
return
;
}
//if
k = k % n;
if
(k <=
0
){
return
;
}
//if
// 翻转前n-k个
Reverse(nums,
0
,n - k -
1
);
// 翻转后k个
Reverse(nums,n - k,n -
1
);
// 翻转全部
Reverse(nums,
0
,n -
1
);
}
private
:
void
Reverse(
int
nums[],
int
left,
int
right){
int
tmp;
for
(
int
i = left,j = right;i < j;++i,--j){
// 交换
swap(nums[i],nums[j]);
}
//for
}
};