返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >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://lsjlt.com/news/146929.html(转载时请注明来源链接)

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

猜你喜欢
  • C语言三种方法解决轮转数组问题
    目录题目1.题目描述2.要求3.原题链接二、相关知识点三、解决思路旋转法直接法空间换取时间题目 1.题目描述 给你一个数组,将数组中的元素向右轮转 k 个位置,其中&nbs...
    99+
    2024-04-02
  • C语言轮转数组问题怎么解决
    今天小编给大家分享一下C语言轮转数组问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。题目描述给你一个数组,将数组中...
    99+
    2023-06-29
  • C语言怎么解决轮转数组问题
    本篇内容主要讲解“C语言怎么解决轮转数组问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言怎么解决轮转数组问题”吧!题目1.题目描述给你一个数组,将数组中的元素向右轮转 k 个位...
    99+
    2023-06-30
  • C语言超详细讲解轮转数组
    目录题目描述实例解题思路1. 先整体逆转2.逆转子数组[0, k - 1]3.逆转子数组[k, numsSize - 1]易错点代码题目描述 给你一个数组,将数组中的元素向右轮转 k...
    99+
    2024-04-02
  • C语言常见问题——数组初始化的四种方法
    在C语言中,我们可以使用四种方法来初始化数组:1. 逐个赋值初始化:通过为数组的每个元素赋值来初始化数组。例如:```cint ar...
    99+
    2023-09-13
    C语言
  • C语言双指针多方法旋转数组解题LeetCode
    目录暴力思路外加数组格局抬高环形替代LeetCode题目如下: 首先这个中等难度我是没搞懂,后面才发现原来中等中在要求多方法上,那就来看看怎么搞定他吧。 暴力思路 首先我说一下我本...
    99+
    2024-04-02
  • C语言中组成不重复的三位数问题
    目录C语言组成不重复的三位数(1)通用思路(2)排除思路打印1234组成的不重复三位数C语言组成不重复的三位数 对于这个问题,我有两种解决思路 第一种较为简单第二种较为复杂 (1)通...
    99+
    2022-11-16
    C语言不重复三位数 组成不重复三位数 不重复三位数C语言
  • 关于C语言一维数组算法问题详解
    目录问题1:将数组中的数逆序存放问题2:求数组中最大值及其下标问题3:找出不是两个数组的共有元素问题4:找出出现次数最多的数问题5:数组中插入数字并排序问题6:数组循环右移问题总结问...
    99+
    2024-04-02
  • 掌握Go语言数组方法的常见问题与解决方案
    掌握Go语言数组方法的常见问题与解决方案 在Go语言中,数组是一种基本的数据结构,它由固定长度的相同数据类型的元素组成。在编写Go程序时,我们经常会使用数组来存储一组数据。然而,由于数...
    99+
    2024-04-02
  • C语言魔方阵的三种实现方法
    目录魔方阵:1.奇数阶魔方阵 2.偶数阶魔方阵 (n=4K)3.偶数阶魔方阵 (n=4K+2)魔方阵: 把1到n*n排成n行n列方阵,使方阵中的每一行、每一列以及对角线上的数之和都相...
    99+
    2024-04-02
  • JavaScript三种方法解决约瑟夫环问题的方法
    目录概述问题描述循环链表有序数组数学递归总结概述 约瑟夫环问题又称约瑟夫问题或丢手绢问题,是一道经典的算法问题。问题描述也有很多变式,但大体的解题思路是相同的。本篇将以循环链表、有序...
    99+
    2024-04-02
  • 关于Mysql 4.1语言问题的完美解决方法(转)
    关于Mysql 4.1语言问题的完美解决方法(转)[@more@]可以不需要修改my.ini。在建立数据库的时候,对库和表的字符集设置不太重要,但是对文本类型的字段最好都设置为GBK字符集。对于已有的数据库...
    99+
    2024-04-02
  • c语言怎么解决素数环问题
    素数环问题是指在一个圆环上排列一组互不相同的素数,使得任意两个相邻的素数之和也是素数。解决素数环问题的一种方法是使用回溯法。以下是一...
    99+
    2023-08-08
    c语言
  • C语言怎么解决Fibonacci数列问题
    在C语言中,可以使用循环或递归的方式来解决Fibonacci数列问题。 使用循环解决Fibonacci数列问题: #includ...
    99+
    2024-02-29
    C语言
  • C语言数组越界引发的死循环问题解决
    目录一、引入二、代码缺陷三、为什么会死循环?四、补充说明五、总结一、引入 下面的程序在VS编译器会出现什么问题?运行结果是什么?为什么? #include <stdio.h&g...
    99+
    2022-11-13
    C语言 数组越界
  • R语言 UTF-8各种问题的解决方案
    R语言在碰到读UTF-8文件,或者处理UTF-8数据时总是会遇到各种各样的问题,本姑娘也是在碰了n多次壁,被气得吐血好多次之后,终于对这类总结出了一些解决办法: 1. 读UTF-8文...
    99+
    2024-04-02
  • C语言获取数组长度的几种方法
    C语言获取数组长度的几种方法有:1. 使用sizeof运算符:可以使用sizeof运算符来获取数组的长度。例如,对于一个整型数组arr,可以使用sizeof(arr) / sizeof(arr[0])来获取数组的长度。2. 使用strl...
    99+
    2023-08-11
    C语言
  • C语言杨辉三角两种实现方法
    目录杨辉三角——C语言实现方法一:利用二维数组实现方法二(对方法一的改进): 总结杨辉三角——C语言实现 杨辉三角: 在屏幕上打印杨辉三角。 1 1 1 1 2 1 1 3 3 1...
    99+
    2024-04-02
  • C语言实现求最大公约数的三种方法
    目录题目描述问题分析代码实现方法一:穷举法方法二:辗转相除法方法三:更相减损法题目描述 求任意两个正整数的最大公约数 问题分析 最大公因数,也称最大公约数、最大公因子,指两个或多个整...
    99+
    2024-04-02
  • C语言函数调用的三种实现方法实例
    目录C语言函数第一种方法第二种方法第三种方法总结C语言函数 1.概念:函数是一组一起执行一个任务的语句,每个c程序都必须有一个main函数,程序员可以把代码划分到不同的函数当中去,在...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作