【Leetcode189-旋转数组Rotate Array】(C语言)

目录

 

旋转字符串

测试单元

题目分析:

1.创建临时数组(1)

2.创建临时数组(2)

3.嵌套函数


旋转字符串

给定一个数组,将数组中的元素向右移动 个位置,其中 是非负数。

示例 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]);
}

猜你喜欢

转载自blog.csdn.net/SoYangA/article/details/81542081
今日推荐