【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时也不会进入,无意识敲得代码居然有如此严密的逻辑性(震惊)

欢迎讨论

相关推荐
huohaiyu15 分钟前
synchronized (Java)
java·开发语言·安全·synchronized
_OP_CHEN21 分钟前
C++基础:(九)string类的使用与模拟实现
开发语言·c++·stl·string·string类·c++容器·stl模拟实现
蓝天智能36 分钟前
QT MVC中View的特点及使用注意事项
开发语言·qt·mvc
木觞清1 小时前
喜马拉雅音频链接逆向实战
开发语言·前端·javascript
wuxuanok1 小时前
苍穹外卖 —— 公共字段填充
java·开发语言·spring boot·spring·mybatis
偷光1 小时前
浏览器中的隐藏IDE: Console (控制台) 面板
开发语言·前端·ide·php
LL_break2 小时前
线程1——javaEE 附面题
java·开发语言·面试·java-ee
MOON404☾2 小时前
Rust 与 传统语言:现代系统编程的深度对比
开发语言·后端·python·rust
先知后行。2 小时前
Reactor模型和类图设计
java·开发语言
清欢ysy3 小时前
Cannot find module ‘@next/bundle-analyzer‘
开发语言·javascript·arcgis