C语言编程实战:每日一题 - day7

欢迎来到 s a y − f a l l 的文章 欢迎来到say-fall的文章 欢迎来到say−fall的文章


🌈这里是say-fall分享,感兴趣欢迎三连与评论区留言 🔥专栏: 《C语言从零开始到精通》 《C语言编程实战》 《数据结构与算法》 《小游戏与项目》 💪格言:做好你自己,你才能吸引更多人,并与他们共赢,这才是你最好的成长方式。


前言:

今天给大家带来一个轮转数组的题目


文章目录


正文:

轮转数组

  • 思路一:先提取最后一个元素然后依次右移,循环k次:
c 复制代码
void rotate(int* nums, int numsSize, int k) 
{
    k %= numsSize;//让k对numsSize取模
    while (k--)//循环k次
    {
        int tmp = nums[numsSize - 1];//先把最后一个元素提取出来
        for (int i = numsSize - 2;i >= 0;i++)
        {
            nums[i + 1] = nums[i];
        }
        nums[0] = tmp;
    }
    return nums;
}
  • 时间复杂度:O(n^2)
  • 本来可以理解为O(n*k) ,但是k取最坏情况是n-1,这样的话可以理解为是O(n^2)
  • 思路二:三次反转法

思路来源:

  1. 对于这个题来说,移动k次,则后k个数可以看作是一组,就他们直接拿到前面去,前面的移动到后面来,顺序没变
  2. 那假设[1,2,3,4,5,6,7]移动3次就变成了[5,6,7,1,2,3,4]
  3. 我们可以看作是
    ①所有元素反转一次[7,6,5,4,3,2,1]
    ②两组元素各反转一次[5,6,7,1,2,3,4]
    这样就理所当然的轮转完成了
c 复制代码
void reserve(int* nums, int left, int right)
{
    while (left < right)
    {
        int tmp = nums[right];
        nums[right] = nums[left];
        nums[left] = tmp;
        left++;
        right--;
    }
}

void rotate(int* nums, int numsSize, int k)
{
    k %= numsSize;
    reserve(nums, 0, k - 1);
    reserve(nums, k, numsSize - 1);
    reserve(nums, 0, numsSize - 1);
}
  • 三次反转法是更高效的实现方式,时间复杂度为 O (n) ,空间复杂度为 O (1)

  • 本节完...
相关推荐
Python大数据分析@2 分钟前
CLI一键采集,使用Python搭建TikTok电商爬虫Agent
开发语言·爬虫·python
@小码农26 分钟前
2026年3月Scratch图形化编程等级考试一级真题试卷
开发语言·数据结构·c++·算法
这儿有一堆花27 分钟前
住宅代理(Residential Proxy)技术指南
开发语言·数据库·php
一只大袋鼠39 分钟前
Java进阶:CGLIB动态代理解析
java·开发语言
秦ぅ时40 分钟前
保姆级教程|OpenAI tts-1-hd模型调用全流程(Python+curl+懒人用法)
开发语言·python
Joseph Cooper44 分钟前
Linux HID 子系统实战:从虚拟键盘到 input 事件上报
linux·c语言·计算机外设
Eiceblue1 小时前
使用 C# 将 Excel 转换为 Markdown 表格(含批量转换示例)
开发语言·c#·excel
爱滑雪的码农1 小时前
Java基础十三:Java中的继承、重写(Override)与重载(Overload)详解
java·开发语言
Java面试题总结1 小时前
使用 Python 设置 Excel 数据验证
开发语言·python·excel
【 】4231 小时前
C++&STL(Standard Template Library,标准模板库)
java·开发语言·c++