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

编程入门 行业动态 更新时间:2024-10-10 17:24:55

【C语言】每日一题(旋转<a href=https://www.elefans.com/category/jswz/34/1771288.html style=数组)"/>

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

旋转数组,链接奉上

目录

  • 方法:
    • 创建额外的数组:
      • 整体思路:
      • 代码实现:
    • 数组反转:
      • 整体思路:
      • 代码实现:
      • 小插曲:

方法:

创建额外的数组:

整体思路:

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

细节:

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

1 2 3 4 5 6 7 原数组
6 7 1 2 3 4 5 轮转后的数组

我们发现:

原数组中的1在新的数组中在第三位2第四位
6第一位
这就说明我们在放置时需要注意不通情况下放置的方法不同

代码实现:

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];}
}

数组反转:

整体思路:

将字符串 反转3次
1.先整体翻转
2.根据k将前半部分再次翻转
3.将剩下的数组再反转

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

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

细节:
当我们传参时,知道数组的首尾,就可以将首尾之间的元素进行翻转,
另外,传参时要注意首尾的大小,防止越界等现象发生

代码实现:

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

欢迎讨论

更多推荐

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

本文发布于:2023-12-05 03:07:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1662875.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数组   语言

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!