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

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

一.题目描述

在这里插入图片描述

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

二.思路分析

本题有三种解法:①暴力求解,旋转k次;②三段逆置;③空间换时间
这里我就用后面两种写法分别进行解题
在这里插入图片描述
在这里插入图片描述

三.代码展示

代码一:三段逆置

错误代码:

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;
}

最后:

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

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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PH_modest

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值