目录
旋转字符串
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入:[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]
示例 2:
输入: [-1,-100,3,99]
和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
说明:
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
- 要求使用空间复杂度为 O(1) 的原地算法。
测试单元
由题知就是将数组的元素向右移动k位,测试用例示例已给出 如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int nums1[7] = { 1, 2, 3, 4, 5, 6, 7 };
int nums2[4] = { -1, -100, 3, 99 };
rotate(nums1, 7, 3);
rotate(nums2, 4, 2);
for (int i = 0; i < 7; i++)
{
printf("%d ", nums1[i]);
}
printf("\n");
for (int i = 0; i < 4; i++)
{
printf("%d ", nums2[i]);
}
system("pause");
return 0;
}
题目分析:
本题要求就是将数组中的内容改变(向右移动),可以有好多种办法在此给出执行速度最快的几种。创建临时数组、不创建临时数组(嵌套函数)。
1.创建临时数组(1)
利用在栈上创建一个跟原本一样的数组,然后按旋转后的数组给本身数组重新赋值。
void rotate(int* nums, int numsSize, int k) {
int temp[numsSize],p=0;
for(int i=0;i<numsSize;i++)
temp[i]=nums[i];
for(int j=0;j<numsSize;j++){
p=(j+k)%numsSize;
nums[p]=temp[j];
}
return *nums;
}
2.创建临时数组(2)
在动态内存内创建数组然后利用memcpy函数进行拷贝(别忘了引头函数#include <string.h>)
void rotate(int* nums, int numsSize, int k)
{
k = k%numsSize;
int* t = (int*)malloc(sizeof(int)*k);
for (int i = 0; i < k; i++)
{
t[i] = nums[numsSize - k + i];
}
for (int i = numsSize - 1; i >= k; i--)
{
nums[i] = nums[i - k];
}
memcpy(nums, t, sizeof(int)*k);
free(t);
}
3.嵌套函数
利用交换函数,交换3次即可得到反转的函数
void reverse(int*left, int*right){
assert(left&&right);
while (left <= right){
int temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k) {
k = k%numsSize;
if (k == 0)
{
return;
}
reverse(&nums[0], &nums[numsSize - k - 1]);
reverse(&nums[numsSize - k], &nums[numsSize - 1]);
reverse(&nums[0], &nums[numsSize - 1]);
}