【每日一题】——轮转数组

博客主页:PH_modest的博客主页
当前专栏:每日一题
其他专栏:
每日反刍
读书笔记
C语言跬步积累
座右铭:广积粮,缓称王!

一.题目描述

【每日一题】——轮转数组_第1张图片

题目链接:189.轮转数组 - 力扣(LeetCode)

二.思路分析

本题有三种解法:①暴力求解,旋转k次;②三段逆置;③空间换时间
这里我就用后面两种写法分别进行解题
【每日一题】——轮转数组_第2张图片
【每日一题】——轮转数组_第3张图片

三.代码展示

代码一:三段逆置

错误代码:

void rotate(int* nums, int numsSize, int k)
{
    //反转整个字符串
    int i = 0;
    int tmp = 0;
    for (i = 0; i < numsSize / 2; i++)
    {
        tmp = *(nums + i);
        *(nums + i) = *(nums + numsSize - 1 - i);
        *(nums + numsSize - 1 - i) = tmp;
    }
    //反转前k个字符
    for (i = 0; i < k / 2; i++)
    {
        tmp = *(nums + i);
        *(nums + i) = *(nums + k - 1 - i);
        *(nums + k - 1 - i) = tmp;
    }
    //反转后numsSize-k个字符
    for (i = 0; i < (numsSize-k)/2; i++)
    {
        tmp = *(nums + k + i);
        *(nums + k + i) = *(nums + numsSize - 1 - i);
        *(nums + numsSize - 1 - i) = tmp;
    }
}

这段代码犯了很多人都会犯的错,没有考虑到反转次数k会大于numsSize,因此在进行反转前需要先判断k是否大于numsSize,如果大于则将k模上numsSize

正确代码:

void rotate(int* nums, int numsSize, int k)
{
	//判断k和numsSize的大小
	if(k>numsSize)
	{
		k%=numsSize;
	}
    //反转整个字符串
    int i = 0;
    int tmp = 0;
    for (i = 0; i < numsSize / 2; i++)
    {
        tmp = *(nums + i);
        *(nums + i) = *(nums + numsSize - 1 - i);
        *(nums + numsSize - 1 - i) = tmp;
    }
    //反转前k个字符
    for (i = 0; i < k / 2; i++)
    {
        tmp = *(nums + i);
        *(nums + i) = *(nums + k - 1 - i);
        *(nums + k - 1 - i) = tmp;
    }
    //反转后numsSize-k个字符
    for (i = 0; i < (numsSize-k)/2; i++)
    {
        tmp = *(nums + k + i);
        *(nums + k + i) = *(nums + numsSize - 1 - i);
        *(nums + numsSize - 1 - i) = tmp;
    }
}

代码二:空间换时间

void rotate(int* nums,int numsSize,int k)
{
	//判断大小
	if(k > numsSize)
	{
		k %= numsSize;
	}
	//申请动态内存
	int* tmp = (int*)malloc(sizeof(int)*numsSize);
	//使用memcpy进行复制
	memcpy(tmp+k,nums,sizeof(int)*(numsSize));//从tmp下标为k的位置开始复制nums
	memcpy(tmp,nums+numsSize-k,sizeof(int)*(k));//从nums下标为nums+numsSize-k的数字开始复制到tmp下标为0的位置
	memcpy(nums,tmp,sizeof(int)*(numsSize));//将tmp的数字(轮转之后)复制到nums中
	//释放空间并将其置空
	free(tmp);
	tmp = NULL;
}

最后:

每日一题系列旨在养成刷题的习惯,所以对代码的解释并不会特别详细,但足够引导大家写出来,选的题目都不会特别难,但也不是特别简单,比较考验大家的基础和应用能力,我希望能够将这个系列一直写下去,也希望大家能够和我一起坚持每天写代码。

在这里送大家一句话:广积粮,缓称王!

你可能感兴趣的:(每日一题,leetcode,算法,c++,数据结构)