一、轮转数组
题目:给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
由示例可知,数组中的元素每向右轮转1个位置时,都是数组中的最后一个元素移到数组的首元素位置上去了
方法1:暴力求解
#include<stdio.h>
void reverse(int nums[], int k, int size)
{
//如果k>=size,则k=k%size,减少没必要的循环
if (k >= size)
{
k %= size;
}
//轮转的次数
for (int s = 1; s <= k; s++)
{
//保存数组最后一个元素的值
int tmp = nums[size-1];
//每一次的轮转数组的变化
for (int i = size - 1; i > 0; i--)
{
nums[i] = nums[i - 1];
}
//把保存下来的值赋给数组首元素
nums[0] = tmp;
}
}
int main()
{
int nums[] = { 1,2,3,4,5,6,7 };
int k = 3;
int sz = sizeof(nums) / sizeof(nums[0]);
reverse(nums, k, sz);
for (int i = 0; i < sz; i++)
{
printf("%d ", nums[i]);
}
return 0;
}
方法2:使用额外的空间(以空间换时间)
#include<stdio.h>
#include<string.h>
void rotate(int* nums, int sz, int k)
{
//开辟与nums数组一样大小的空间
int* tmp = (int*)malloc(sizeof(int) * sz);
int i = 0;
//如果k>=size,则k=k%size,减少没必要的循环
if (k >= sz)
{
k %= sz;
}
//先把后sz-k-1个元素拷贝到tmp中去
for (i = 0; i < k; i++)
{
tmp[i] = nums[sz - k + i];
}
//再把前k-1个元素拷贝到tmp中去
for (i = 0; i < sz-k; i++)
{
tmp[k+i] = nums[i];
}
//最后,把tmp的内容拷贝到nums中去
for (i = 0; i < sz; i++)
{
nums[i] = tmp[i];
}
//释放动态开辟的空间
free(tmp);
tmp = NULL;
}
int main()
{
int nums[] = { 1,2,3,4,5,6,7 };
int k = 3;
int sz = sizeof(nums) / sizeof(nums[0]);
rotate(nums, sz, k);
for (int i = 0; i < sz; i++)
{
printf("%d ", nums[i]);
}
return 0;
}
方法3:三步反转法
#include<stdio.h>
//把下标为right与left的元素逆置,传数组和要修改的下标位置
void reverse(int nums[], int right, int left)
{
while (right < left)
{
int tmp = nums[right];
nums[right] = nums[left];
nums[left] = tmp;
right++;
left--;
}
}
void rotate(int nums[], int sz, int k)
{
if (k >= sz)
{
k %= sz;
}
//散步反转法
reverse(nums, 0,sz - k-1);
reverse(nums, sz - k, sz - 1);
reverse(nums, 0, sz - 1);
}
int main()
{
int nums[] = { 1,2,3,4,5,6,7 };
int k = 3;
int sz = sizeof(nums) / sizeof(nums[0]);
rotate(nums, sz, k);
for (int i = 0; i < sz; i++)
{
printf("%d ", nums[i]);
}
return 0;
}
以上就是轮转数组的方法,如果有疑问可以留言哦~
只要有一次上课不化妆,之后就会有一千次一万次,只要你赞我一票,将来还你千千万万赞!!!