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

欢迎讨论

相关推荐
搁浅°879几秒前
IO文件拷贝
java·开发语言
David猪大卫15 分钟前
数据结构修炼——顺序表和链表的区别与联系
c语言·数据结构·学习·算法·leetcode·链表·蓝桥杯
Iceberg_wWzZ16 分钟前
数据结构(Day14)
linux·c语言·数据结构·算法
微尘818 分钟前
C语言存储类型 auto,register,static,extern
服务器·c语言·开发语言·c++·后端
liangbm325 分钟前
MATLAB系列05:自定义函数
开发语言·笔记·matlab·教程·函数·自定义函数·按值传递
计算机学姐25 分钟前
基于PHP的电脑线上销售系统
开发语言·vscode·后端·mysql·编辑器·php·phpstorm
三玖诶34 分钟前
如何在 Qt 的 QListWidget 中为某一行添加点击事件
开发语言·qt
InJre41 分钟前
QT widgets 窗口缩放,自适应窗口大小进行布局
开发语言·qt·ui
可愛小吉43 分钟前
Python 课程10-单元测试
开发语言·python·单元测试·tdd·unittest
五味香1 小时前
C++学习,动态内存
java·c语言·开发语言·jvm·c++·学习·算法