博客主页:PH_modest的博客主页
当前专栏:每日一题
其他专栏:
每日反刍
读书笔记
C语言跬步积累
座右铭:广积粮,缓称王!
题目链接:189.轮转数组 - 力扣(LeetCode)
错误代码:
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;
}
每日一题系列旨在养成刷题的习惯,所以对代码的解释并不会特别详细,但足够引导大家写出来,选的题目都不会特别难,但也不是特别简单,比较考验大家的基础和应用能力,我希望能够将这个系列一直写下去,也希望大家能够和我一起坚持每天写代码。
在这里送大家一句话:广积粮,缓称王!