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

欢迎讨论

相关推荐
Y1nhl26 分钟前
搜广推校招面经八十一
开发语言·人工智能·pytorch·深度学习·机器学习·推荐算法·搜索算法
Algorithm157627 分钟前
谈谈接口和抽象类有什么区别?
java·开发语言
yu41062129 分钟前
Rust 语言使用场景分析
开发语言·后端·rust
良艺呐^O^30 分钟前
uniapp实现app自动更新
开发语言·javascript·uni-app
264玫瑰资源库2 小时前
问道数码兽 怀旧剧情回合手游源码搭建教程(反查重优化版)
java·开发语言·前端·游戏
普if加的帕3 小时前
java Springboot使用扣子Coze实现实时音频对话智能客服
java·开发语言·人工智能·spring boot·实时音视频·智能客服
安冬的码畜日常4 小时前
【AI 加持下的 Python 编程实战 2_10】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(中)
开发语言·前端·人工智能·ai·扫雷游戏·ai辅助编程·辅助编程
朝阳5814 小时前
Rust项目GPG签名配置指南
开发语言·后端·rust
朝阳5814 小时前
Rust实现高性能目录扫描工具ll的技术解析
开发语言·后端·rust
程高兴4 小时前
基于Matlab的车牌识别系统
开发语言·matlab