每日一题---OJ题: 旋转数组

这篇具有很好参考价值的文章主要介绍了每日一题---OJ题: 旋转数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

片头

嗨! 小伙伴们,咱们又见面啦,今天我们一起来学习一道OJ题---旋转数组

每日一题---OJ题: 旋转数组,算法

emmm,看上去好像没有那么难,我们一起来分析分析 

每日一题---OJ题: 旋转数组,算法

比如: 数组里面有7个元素,分别为 1, 2, 3, 4, 5, 6, 7 , 现在我们将数组中的元素向右轮转3个位置

第一次轮转:将最后一个元素"7"放在第一个位置,后面的元素依次往后移动,变成  7, 1, 2, 3, 4, 5, 6

第二次轮转:将最后一个元素"6"放在第一个位置,后面的元素依次往后移动,变成  6, 7, 1, 2, 3, 4, 5

第三次轮转:将最后一个元素"5"放在第一个位置,后面的元素依次往后移动,变成  5, 6, 7, 1, 2, 3, 4

针对这道题,我们提供3种思路:

思路1: 右旋k次, 每次挪动旋转一位

定义一个变量temp,用来保存最后一个元素,将最后一个元素放到第一个位置,同时将后面的元素依次往右移动

代码如下:

void Reverse(int arr[], int time, int size) {
    time = time % size; //求具体的旋转次数
    for (int i = 0; i < time; i++) {
        //将最后一个元素保存在temp变量中
        int temp = arr[size - 1];
        for (int j = size-2; j >=0 ; j--) {
        //从下标为size-2的元素开始,一直到下标为0的元素,依次往后移动一位
            arr[j + 1] = arr[j];
        }
        //将最后一个元素放入第一个位置(还原)
        arr[0] = temp;
    }
}
int main() {
    int time = 3;
    int arr[] = { 1,2,3,4,5,6,7 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    Reverse(arr, time,sz);
    for (int i = 0; i < sz; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

运行结果为:

5  6  7  1  2  3  4 

But,当我们把代码放到leetcode上面显示不通过

每日一题---OJ题: 旋转数组,算法

每日一题---OJ题: 旋转数组,算法

哈哈哈哈,说明这道OJ题限制了时间复杂度,我们这种思路的时间复杂度为 O(n^2) ,题目不通过

那我们就换一种思路呗!

每日一题---OJ题: 旋转数组,算法

思路2: 我们把数组分成3个部分逆置,假设数组里面有7个元素,分别为 1, 2, 3, 4, 5, 6, 7 , 现在我们将数组中的元素向右轮转3个位置

第一个部分: 前n-k个逆置,这里的 n 为 7, k 为 3,也就是前4个逆置,变成 4, 3, 2, 1, 5, 6, 7
第二个部分: 后k个逆置, 这里的 k 为 3,也就是后3个逆置, 变成 4, 3, 2, 1, 7, 6, 5
第三个部分: 整体逆置,变成了 5, 6, 7, 1, 2, 3, 4

代码如下:

void Reverse1(int arr[], int start, int end) {
    int left = start;    //将start赋给left变量
    int right = end;     //将end赋给right变量

    while (left < right) 
    {     
        //当left小于right的时候,进入循环
        //用临时变量temp实现逆置(左右元素交换)
        int temp = arr[left]; 
        arr[left] = arr[right];
        arr[right] = temp;
        left++;   //每交换完一次,left向右移动
        right--;  //每交换完一次,right向左移动,直到两个变量相遇
    }    
}

int main() {
    int time = 3;
    int arr[] = { 1,2,3,4,5,6,7 };
    int sz = sizeof(arr) / sizeof(arr[0]);

    Reverse1(arr, 0, sz - time - 1);     //前n-k个逆置
    Reverse1(arr, sz - time, sz - 1);    //后k个逆置
    Reverse1(arr, 0, sz - 1);            //整体逆置

    for (int i = 0; i < sz; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

运行结果为:

5  6  7  1  2  3  4  

同时,我们将代码放到leetcode当中,显示通过

每日一题---OJ题: 旋转数组,算法

嗯,这种方法好是好,但是好像我如果第一次做这种题,肯定想不出来,那有木有第3种思路呢?

有的! 接下来我就来介绍第三种思路

思路3: 我们可以定义一个新的数组,用memcpy函数将原数组的内容拷贝到新数组中去,拷贝元素的同时,也就完成了逆置

每日一题---OJ题: 旋转数组,算法

代码如下:

void Reverse2(int arr[], int size, int time) {
    time = time % size;   //求出最终旋转次数
    int temp[20] = { 0 }; //定义一个临时数组temp,初始化数组为0

             //将原数组的后time个数拷贝到临时数组temp的前面位置中
    memcpy(temp, arr + size - time, sizeof(int) * time); 
             //将原数组的前size-time个数拷贝到临时数组temp的后面位置中  
    memcpy(temp + time, arr, sizeof(int) * (size - time)); 
            //将临时数组temp的所有元素拷贝回原数组
    memcpy(arr, temp, sizeof(int) * size);                  
}

int main() {
    int nums[] = { 1,2,3,4,5,6,7 };
    int time = 3;
    int size = sizeof(nums) / sizeof(nums[0]);
    Reverse2(nums, size, time);
    for (int i = 0; i < size; i++) {
        printf("%d ", nums[i]);
    }
    return 0;
}

运行结果为:

 5  6  7  1  2  3  4 

我们把代码提交到leetcode上去,显示通过 

每日一题---OJ题: 旋转数组,算法

片尾 

今天我们学习了轮转数组这道OJ题,希望看完这篇文章能对友友们有所帮助 !    !    ! 

点赞收藏加关注 !   !   !

谢谢大家 !   !   !

每日一题---OJ题: 旋转数组,算法文章来源地址https://www.toymoban.com/news/detail-848806.html

到了这里,关于每日一题---OJ题: 旋转数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Leetcode-每日一题【61.旋转链表】

    给你一个链表的头节点  head  ,旋转链表,将链表每个节点向右移动  k   个位置。 示例 1: 输入:head = [1,2,3,4,5], k = 2 输出:[4,5,1,2,3] 示例 2:   输入: head = [0,1,2], k = 4 输出: [2,0,1] 提示: 链表中节点的数目在范围  [0, 500]  内 -100 = Node.val = 100 0 = k = 2 * 109 1.根据题目给出

    2024年02月11日
    浏览(25)
  • C语言每日一题之旋转数求最小值

    hello,今天我们分享一道题目,是牛客网上的一道题 求旋转数组中的最小值https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13tqId=23269ru=/ta/coding-interviewsqru=/ta/coding-interviews/question-ranking 那我们先来看一下题目的意思,首先要读懂题目讲的是什么 题目说一个非降序数组,

    2024年02月13日
    浏览(24)
  • 【每日一题】最长交替子数组

    【双层循环】【单层循环】【数组】【2024-01-23】 2765. 最长交替子数组 两个方法,一个是双层循环,一个是单层循环。 思路 第一层枚举子数组的起点,第二层从起点的下一个元素开始枚举,判断接下来的字符是否满足交替子数组的条件。如是则更新长度,否则调出内层循环

    2024年01月24日
    浏览(34)
  • 每日一题151——数组的度

    给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。 示例 1: 输入:nums = [1,2,2,3,1] 输出:2 解释: 输入数组的度是 2 ,因为元素 1 和

    2024年02月05日
    浏览(23)
  • (数组) 941. 有效的山脉数组 ——【Leetcode每日一题】

    难度:简单 给定一个整数数组 arr ,如果它是有效的山脉数组就返回 true ,否则返回 false 。 让我们回顾一下,如果 arr 满足下述条件,那么它是一个山脉数组: arr.length = 3 在 0 i arr.length - 1 条件下,存在 i 使得: arr[0] arr[1] ... arr[i-1] arr[i] arr[i] arr[i+1] ... arr[arr.length - 1] 示例

    2024年02月09日
    浏览(46)
  • ( 数组和矩阵) 697. 数组的度 ——【Leetcode每日一题】

    难度:简单 给定一个非空且只包含非负数的整数数组 nums ,数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。 示例 1: 输入:nums = [1,2,2,3,1] 输出:2 解释: 输入数组的度是 2 ,因为

    2024年02月02日
    浏览(33)
  • ( 数组) 209. 长度最小的子数组——【Leetcode每日一题】

    难度:中等 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数

    2024年02月06日
    浏览(28)
  • Leetcode每日一题——“合并两个有序数组”

    各位CSDN的uu们你们好呀,又到小雅兰的愉快题解时候啦,今天,我们的题目内容是合并两个有序数组,下面,让我们进入合并两个有序数组的世界吧 示例 1: 输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 输出:[1,2,2,3,5,6] 解释:需要合并 [1,2,3] 和 [2,5,6] 。 合并结果是 [ 1,2

    2023年04月24日
    浏览(57)
  • LeetCode每日一题——1331.数组序号转换

    题目传送门 给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。 序号代表了一个元素有多大。序号编号的规则如下: 序号从 1 开始编号。 一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。 每个数字的序号都应该尽可能地小。

    2024年02月14日
    浏览(26)
  • 【LeetCode每日一题】——1331.数组序号转换

    排序 简单 1331.数组序号转换 给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。 序号代表了一个元素有多大。序号编号的规则如下: 序号从 1 开始编号。 一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。 每个数字的序号都

    2024年02月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包