【C语言】每日一题(旋转数组)

旋转数组,链接奉上

目录

方法:

创建额外的数组:

整体思路:

创建一个额外的数组 ,将原数组中的数字根据k(即要向右轮转的个数)放到新的数组中,最后将新的数组赋值给原数组

细节:

在放置在数组时,分为两种情况:
例如:

c 复制代码
1 2 3 4 5 6 7 原数组
6 7 1 2 3 4 5 轮转后的数组

我们发现:

原数组中的1 在新的数组中在第三位2第四位 ...

6第一位 ...

这就说明我们在放置时需要注意不通情况下放置的方法不同

代码实现:

c 复制代码
void rotate(int* nums, int numsSize, int k)
{
    k = k % numsSize;
    int arr[numsSize];
    int j = 0;
    for(int i = 0; i < numsSize; i++)
    {
        //判断两种情况
        if(i + k <= numsSize - 1)
        {
            arr[i+k] = nums[i];
        }
        else
        {
            arr[j++] = nums[i];
        }
    }
    //赋值到原数组
    for(int i = 0; i < numsSize; i++)
    {
        nums[i] = arr[i];
    }
}

数组反转:

整体思路:

:
1.先整体翻转

复制代码
2.根据k将前半部分再次翻转   

3.将剩下的数组再反转

例如:假设我们有如下数组,我们轮转2

c 复制代码
1 2 3 4 5 6 原数组
6 5 4 3 2 1 整体翻转的数组
5 6 1 2 3 4 将6与5翻转,4到1翻转后的结果即为轮转2个的结果

细节:

当我们传参时,知道数组的首尾,就可以将首尾之间的元素进行翻转,

另外,传参时要注意首尾的大小,防止越界等现象发生

代码实现:

c 复制代码
void reverse(int* start,int* end)
{
   while(end > start)
   {
       int tmp = *start;
       *start = *end;
       *end = tmp;
       end--;
       start++;
   }
}

void rotate(int* nums, int numsSize, int k)
{
    k = k % numsSize;
    reverse(nums, nums + numsSize - 1);
    reverse(nums, nums + k -1);
    reverse(nums + k, nums + numsSize - 1);
}

小插曲:

当时实现代码时,我考虑到nums+k-1会出现负数的情况,但是我打算先将整体逻辑敲出来,敲出来之后就直接提交了,没想到的是居然能过,这就让我困惑起来

后来我举例代入,发现当nums+k-1小于0时,while循环不会进入,=0时也不会进入,无意识敲得代码居然有如此严密的逻辑性(震惊)

欢迎讨论

相关推荐
沐知全栈开发24 分钟前
HTML DOM 访问
开发语言
脑袋大大的1 小时前
JavaScript 性能优化实战:减少 DOM 操作引发的重排与重绘
开发语言·javascript·性能优化
二进制person2 小时前
Java SE--方法的使用
java·开发语言·算法
OneQ6663 小时前
C++讲解---创建日期类
开发语言·c++·算法
码农不惑3 小时前
2025.06.27-14.44 C语言开发:Onvif(二)
c语言·开发语言
Coding小公仔5 小时前
C++ bitset 模板类
开发语言·c++
凌肖战5 小时前
力扣网C语言编程题:在数组中查找目标值位置之二分查找法
c语言·算法·leetcode
小赖同学啊5 小时前
物联网数据安全区块链服务
开发语言·python·区块链
shimly1234565 小时前
bash 脚本比较 100 个程序运行时间,精确到毫秒,脚本
开发语言·chrome·bash