iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言三种方法解决轮转数组问题
  • 341
分享到

C语言三种方法解决轮转数组问题

2024-04-02 19:04:59 341人浏览 八月长安
摘要

目录题目1.题目描述2.要求3.原题链接二、相关知识点三、解决思路旋转法直接法空间换取时间题目 1.题目描述 给你一个数组,将数组中的元素向右轮转 k 个位置,其中&nbs

题目

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个数字:

1.后k个数字逆置

2.前n-k个数字逆置

3.整体逆置

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

以示例 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)

附上结果运行图:

直接法

看到这道题,我们的第一种想法就是直接去旋转,当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),没能跑得过去,超时了,给出运行结果图

空间换取时间

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

代码如下

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语言轮转数组内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言三种方法解决轮转数组问题

本文链接: https://www.lsjlt.com/news/146929.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • C语言三种方法解决轮转数组问题
    目录题目1.题目描述2.要求3.原题链接二、相关知识点三、解决思路旋转法直接法空间换取时间题目 1.题目描述 给你一个数组,将数组中的元素向右轮转 k 个位置,其中&nbs...
    99+
    2022-11-13
  • C语言怎么解决轮转数组问题
    本篇内容主要讲解“C语言怎么解决轮转数组问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言怎么解决轮转数组问题”吧!题目1.题目描述给你一个数组,将数组中的元素向右轮转 k 个位...
    99+
    2023-06-30
  • C语言轮转数组问题怎么解决
    今天小编给大家分享一下C语言轮转数组问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。题目描述给你一个数组,将数组中...
    99+
    2023-06-29
  • C语言常见问题——数组初始化的四种方法
    在C语言中,我们可以使用四种方法来初始化数组:1. 逐个赋值初始化:通过为数组的每个元素赋值来初始化数组。例如:```cint ar...
    99+
    2023-09-13
    C语言
  • C语言双指针多方法旋转数组解题LeetCode
    目录暴力思路外加数组格局抬高环形替代LeetCode题目如下: 首先这个中等难度我是没搞懂,后面才发现原来中等中在要求多方法上,那就来看看怎么搞定他吧。 暴力思路 首先我说一下我本...
    99+
    2022-11-13
  • 关于C语言一维数组算法问题详解
    目录问题1:将数组中的数逆序存放问题2:求数组中最大值及其下标问题3:找出不是两个数组的共有元素问题4:找出出现次数最多的数问题5:数组中插入数字并排序问题6:数组循环右移问题总结问...
    99+
    2022-11-12
  • 关于Mysql 4.1语言问题的完美解决方法(转)
    关于Mysql 4.1语言问题的完美解决方法(转)[@more@]可以不需要修改my.ini。在建立数据库的时候,对库和表的字符集设置不太重要,但是对文本类型的字段最好都设置为GBK字符集。对于已有的数据库...
    99+
    2022-10-18
  • C语言数组越界引发的死循环问题解决
    目录一、引入二、代码缺陷三、为什么会死循环?四、补充说明五、总结一、引入 下面的程序在VS编译器会出现什么问题?运行结果是什么?为什么? #include <stdio.h&g...
    99+
    2022-11-13
    C语言 数组越界
  • Python与C语言分别解决完全平方数问题
    1 案例 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 2 分析 由题意我们可以设该数为x ,加100后得到的完全平方数为再加168后得...
    99+
    2022-11-13
  • C语言中大小端问题实例探索解决方法
    目录一、什么是大小端二、举个例子三、大小端演示四、解释"二"中举例的问题五、怎么判断是大端还是小端六、一个题目一、什么是大小端 大端模式:就是高位字节数据存放在内...
    99+
    2023-02-14
    C语言大小端 C语言大小端问题
  • nodejs和C语言插入mysql数据库乱码问题的解决方法
    在这里记录了nodejs过程中的一些乱码情况,这里的乱码主要是由于网页的编码方式与nodejs的默认解码方式(utf8)不一致所造成的。这一次要说一下的是在C语言和nodejs与MySQL进行交互的时候出现...
    99+
    2022-06-04
    乱码 解决方法 语言
  • C语言结构体数组常用的三种赋值方法(包含字符串)
    目录一、按照成员变量进行赋值(麻烦,好理解,字符串赋值需要strcpy)二、对数组整体进行赋值。(一次性需要把所有的都添加进去,不需要strcpy)     &n...
    99+
    2022-11-13
  • C++中常见的数据类型转换问题及解决方法
    C++ 中常见的数据类型转换问题及解决方法引言:在 C++ 编程中,经常会遇到不同数据类型之间的转换问题。正确地进行数据类型转换是保证程序正确性和性能的关键之一。本文将介绍一些常见的数据类型转换问题,并提供相应的解决方法和具体的代码示例。一...
    99+
    2023-10-22
    解决方法 数据类型转换 C++问题
  • JSP数据和JavaScirpt数据交互使用问题的一种解决方法 (转)
    JSP数据和JavaScirpt数据交互使用问题的一种解决方法 (转)[@more@]JSP数据和JavaScirpt数据交互使用问题的一种解决方法  对于web程序来说,前端(Javascript)和后端(JSP/servlet...
    99+
    2023-06-03
  • 解决在Mac上无法向U盘写入数据的问题:三种有效方法
    方法一:重新格式化U盘 Mac OS默认情况下不支持向NTFS卷写入。你可以选择重新格式化你的U盘为exFAT或者Mac OS扩展,下面是如何进行这个操作的步骤: 注意:格式化操作会删除U盘上的所有数据,所以在开始之前请务必备份你的数据。 ...
    99+
    2023-08-31
    macos java 开发语言
  • 分布式场景下的数组同步问题:Go语言的解决方案
    在分布式系统中,对于多个节点之间的数据同步问题,数组同步问题是一个常见的难点。特别是在高并发、大数据量的场景下,同步的效率和准确性更是考验着系统的稳定性。Go语言作为一门高效且简洁的编程语言,在处理分布式场景下的数组同步问题方面有着独特的...
    99+
    2023-10-09
    数组 分布式 同步
  • Go语言编程中,如何应用数组算法解决Linux系统问题?
    Linux系统是一个开源的操作系统,它在服务器领域有着广泛的应用。然而,Linux系统也存在着一些问题,例如系统崩溃、性能下降等。这些问题可能会影响到用户的使用体验,因此需要通过一些手段来解决。 在Go语言编程中,我们可以使用数组算法来解...
    99+
    2023-07-02
    linux 编程算法 数组
  • 使用C#二维数组时内索引数错误问题的解决方法
    本篇内容主要讲解“使用C#二维数组时内索引数错误问题的解决方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用C#二维数组时内索引数错误问题的解决方法”吧!今天又用到了C#二维数组,好久没用了...
    99+
    2023-06-18
  • C语言中四种取整方式,取余/取模运算以及负数取模问题详解
    目录零向取整、负无穷向取整、正无穷向取整、四舍五入取整总结零向取整、负无穷向取整、正无穷向取整、四舍五入取整 如果将一个浮点数赋值给整形,只会保存整数位: 这种取整方式为零向取整...
    99+
    2022-11-12
  • LeetCode数组问题的最佳解决方案:使用Go语言编写Linux命令行程序
    在LeetCode的面试中,数组问题是最常见的问题之一。在解决这些问题时,我们需要快速、高效地编写代码,以展示我们在数据结构和算法方面的技能。在此过程中,使用Go语言编写Linux命令行程序是一种非常有效的方法。 Go语言是一种高性能的编...
    99+
    2023-09-23
    leetcode 数组 linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作