我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言怎么解决轮转数组问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C语言怎么解决轮转数组问题

本篇内容主要讲解“C语言怎么解决轮转数组问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言怎么解决轮转数组问题”吧!

题目

1.题目描述

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:

输入:

nums = [1,2,3,4,5,6,7], k = 3

输出:

[5,6,7,1,2,3,4] 

解释:

向右轮转 1 步: [7,1,2,3,4,5,6]

向右轮转 2 步: [6,7,1,2,3,4,5]

向右轮转 3 步: [5,6,7,1,2,3,4]

2.要求

进阶:

  • 尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。

  • 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?

3.原题链接

 189. 轮转数组 - 力扣(LeetCode) (leetcode-cn.com)

二、相关知识点

本题实际上涉及到了复杂度的问题,包括时间复杂度和空间复杂度。

三、解决思路

旋转法

最优思路,这需要我们有较好的理解力了,可以把数组分为三个部分

假设我们需要选择k个数字:

后k个数字逆置

前n-k个数字逆置

整体逆置

此方法为最优法。符合题目要求

以示例 1为例子说明:

1 2 3 4 5 6 7//旋转3个数字
1 2 3 4 7 6 5//后k个数字逆置
4 3 2 1 7 6 5//前n-k个数字逆置
5 6 7 1 2 3 4//整体逆置

源代码如下:

void reverse(int*nums,int left,int right){    while(left<right)    {        int tmp = nums[left];        nums[left]=nums[right];        nums[right] = tmp;        ++left;        --right;    }}void rotate(int* nums, int numsSize, int k){    k%=numsSize;    reverse(nums,0,numsSize-k-1);    reverse(nums,numsSize-k,numsSize-1);    reverse(nums,0,numsSize-1);}

注意点:k的大小可能大于数组的大小,所以我们要取模!

这个算法的时间复杂度为O(N),空间复杂度为O(1)

附上结果运行图:

C语言怎么解决轮转数组问题

直接法

看到这道题,我们的第一种想法就是直接去旋转,当k=1是。我们就直接把最后一位的数字移动第一位,然后第二位开始往后移动,我们可以创建一个临时的变量来记录当前的最后一位,当k很大时,我们自然就是用循环去做,这是每个人都能想得到的一种方法

代码如下

void rotate(int* nums, int numsSize, int k){    k %=numsSize;  while(k--){      int tmp = nums[numsSize-1];      for(int end = numsSize-2;end>=0;--end){          nums[end+1] = nums[end];      }      nums[0] = tmp;  }}

遗憾的是,这种算法的空间复杂(k*N),没能跑得过去,超时了,给出运行结果图

C语言怎么解决轮转数组问题

空间换取时间

以空间换取时间,这是比较常见的,就是额外开辟一个数组,存放选择的几个数字,然后将之前的数据存储到该数组的后半部分。最后将新数组拷贝到原来的数组中

代码如下

void rotate(int* nums, int numsSize, int k){   k %= numsSize;   int *newnum = (int*)malloc(sizeof(int)*numsSize);   int j = 0;   for(int i =numsSize-k;i<numsSize;i++){       newnum[j++] =nums[i];   }   for(int i = 0;i<numsSize-k;i++){       newnum[i+k] = nums[i];   }   memcpy(nums,newnum,sizeof(int)*numsSize);}

运行结果如图

C语言怎么解决轮转数组问题

到此,相信大家对“C语言怎么解决轮转数组问题”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C语言怎么解决轮转数组问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言轮转数组问题怎么解决

今天小编给大家分享一下C语言轮转数组问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。题目描述给你一个数组,将数组中
2023-06-29

C语言怎么解决轮转数组问题

本篇内容主要讲解“C语言怎么解决轮转数组问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言怎么解决轮转数组问题”吧!题目1.题目描述给你一个数组,将数组中的元素向右轮转 k 个位置,其中
2023-06-30

c语言怎么解决素数环问题

素数环问题是指在一个圆环上排列一组互不相同的素数,使得任意两个相邻的素数之和也是素数。解决素数环问题的一种方法是使用回溯法。以下是一个使用C语言实现的解法:```c#include #include // 判断一个数是否为素数bool is
2023-08-08

C语言怎么解决无重复数字问题

这篇文章主要介绍了C语言怎么解决无重复数字问题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言怎么解决无重复数字问题文章都会有所收获,下面我们一起来看看吧。题目:有1、2、3、4个数字,能组成多少个互不相同
2023-06-17

leetcode旋转数组问题怎么解决

本篇内容介绍了“leetcode旋转数组问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!解题思路暴力法每次旋转1个位置, 旋转k次
2023-06-27

C语言怎么用堆解决Topk问题

这篇文章给大家分享的是有关C语言怎么用堆解决Topk问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言将详细讲解如何利用小根堆的方法解决TopK问题,这么多数据要处理,该算法时间复度居然只需TopK问题Top
2023-06-21

c语言汉诺塔问题怎么解决

解决汉诺塔问题的常见方法是使用递归。以下是使用递归解决C语言汉诺塔问题的示例代码:```c#include void hanoi(int n, char from_rod, char to_rod, char aux_rod) {if (n
2023-10-07

C语言数学问题与简单DP背包问题怎么解决

本篇内容介绍了“C语言数学问题与简单DP背包问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!数学顾名思义,数学类的题就是都可以用数
2023-06-30

c语言小球反弹问题怎么解决

在C语言中,可以使用循环结构来模拟小球的反弹问题。以下是一个简单的解决方案:```c#include int main() {int height; // 小球初始高度int times; // 反弹次数printf("请输入小球
2023-08-18

C语言怎么解决兔子产子问题

本篇内容主要讲解“C语言怎么解决兔子产子问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言怎么解决兔子产子问题”吧!1. 问题描述有一对兔子,从出生后的第 3 个月起每个月都生一对兔子。小
2023-06-29

c语言怎么解决24点游戏问题

这篇文章主要讲解了“c语言怎么解决24点游戏问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c语言怎么解决24点游戏问题”吧!问题你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通
2023-06-19

C语言数组越界引发的死循环问题解决

本文主要介绍了C语言数组越界引发的死循环问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022-11-13

C语言平衡二叉树问题怎么解决

这篇文章主要介绍“C语言平衡二叉树问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言平衡二叉树问题怎么解决”文章能帮助大家解决问题。一、题目描述给定一个二叉树,判断它是否是高度平衡的二
2023-06-30

c语言的连续赋值问题怎么解决

C语言的连续赋值问题是指在一条语句中连续赋值多个变量时可能会出现的问题。例如:int a, b;a = b = 10;在这个例子中,b的值会被赋为10,然后再将b的值赋给a。这样的连续赋值可能会导致意外的结果。要解决这个问题,可以使
2023-10-27

C语言倒置字符串问题怎么解决

这篇文章主要介绍“C语言倒置字符串问题怎么解决”,在日常操作中,相信很多人在C语言倒置字符串问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言倒置字符串问题怎么解决”的疑惑有所帮助!接下来,请跟
2023-07-05

c语言int未赋初值问题怎么解决

在C语言中,如果一个int类型的变量未赋初值,它的值是不确定的,可能是随机的。为了避免这种情况,可以通过以下方法解决:直接为int变量赋初值:在声明int变量的同时,赋予一个初始值,例如:int a = 0;。在使用int变量之前,先进行初
c语言int未赋初值问题怎么解决
2024-02-29

C语言递归函数与汉诺塔问题怎么解决

今天小编给大家分享一下C语言递归函数与汉诺塔问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。递归函数直接或者间接调
2023-07-02

C语言怎么解决抓交通肇事犯问题

这篇文章主要介绍“C语言怎么解决抓交通肇事犯问题”,在日常操作中,相信很多人在C语言怎么解决抓交通肇事犯问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言怎么解决抓交通肇事犯问题”的疑惑有所帮助!接下来
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录