返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言双指针多方法旋转数组解题LeetCode
  • 954
分享到

C语言双指针多方法旋转数组解题LeetCode

2024-04-02 19:04:59 954人浏览 薄情痞子
摘要

目录暴力思路外加数组格局抬高环形替代LeetCode题目如下: 首先这个中等难度我是没搞懂,后面才发现原来中等中在要求多方法上,那就来看看怎么搞定他吧。 暴力思路 首先我说一下我本

LeetCode题目如下:

在这里插入图片描述

首先这个中等难度我是没搞懂,后面才发现原来中等中在要求多方法上,那就来看看怎么搞定他吧。

暴力思路

首先我说一下我本人的思路,就是函数进行倒序操作,分三步:

1.整体倒序 :1234567-------7654321

2.前半部分倒序:7654321------- 5674321

3.后半部分倒序:5674321-------5671234

由于题目已经给出了我们 k 的值,我们直接暴力思路(注意是暴力思路非暴力求解),双指针交换对应的值就行:

void exchange(int* a, int* b)
{
int n=*a;
*a = *b;
*b = n;
}   //交换a,b位置
void reverse(int* nums,int left,int right)
{
while(left<right)
{
exchange(&nums[left],&nums[right]);
left++;
right--;
}   //对指定范围内元素进行翻转操作
}
void rotate(int* nums, int numsSize, int k){
k%=numsSize;
if(k==0)
{
return ;  //防止k过大或0导致无意义操作
}
reverse(nums,0,numsSize-1);//全倒序
reverse(nums,0,k-1);//前半部分倒序
reverse(nums,k,numsSize-1);//后半部分倒序
}

这种方法直观,最容易想到,特点是思路清晰,完美符合了流程,时间复杂度是O(n),空间复杂度是O(1),将将就就

外加数组

自力更生不想要咱就寻求外援嘛,直接创建一个额外数组,前半部分放前面,后半部分放后面不就行了,用 numsSize 表示数组的长度,我们遍历原数组,将原数组下标为 n 的元素放至新数组下标为 n+k 的位置,最后将新数组拷贝至原数组即可:

void rotate(int* nums, int numsSize, int k){
int arr[numsSize] = {0};
for(int n = 0;n<numsSize;n++)
{
arr[(k+n)%numsSize] = nums[n]; //nums所有元素向前移动 k 个单位,依次存到数组arr
}
for(int n = 0;n<numsSize;n++)
{
nums[n] = arr[n];  //将arr数组内容拷贝回原数组nums
}

同理,我们可以选择直接 malloc 一块空间出来,这种方法同上不赘述

格局抬高

既然我们能想到 malloc 开辟空间操作,那再想想库函数里面好像还有个好东西叫 memcpy ,头文件:#include <string.h>,memcpy() 用来复制内存,且忽略 \0,其原型为:

  void * memcpy ( void * dest, const void * src, size_t num );

memcpy() 会复制 src 所指的内存内容的前 num 个字节到 dest 所指的内存地址上。memcpy() 并不关心被复制的数据类型,只是逐字节地进行复制,这给函数的使用带来了很大的灵活性,可以面向任何数据类型进行复制。

代码如下:

void rotate(int* nums, int numsSize, int k){
int arr[numsSize];
k %= numsSize;
memcpy(arr,nums+(numsSize-k),k*(int)sizeof(int));
memcpy(arr+k,nums,(numsSize-k)*(int)sizeof(int));
memcpy(nums,arr,numsSize*(int)sizeof(int));
}

但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法,所以可能会有一个疑问就是为什么不用 memmove?

memmove 相比 memcpy 更容易造成数据丢失。如果目标区域和源区域有重叠的话,memmove() 能保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

强调一下,与 strcpy() 不同的是,memcpy() 会完整的复制 num 个字节,不会因为遇到“\0”而结束。

环形替代

在这里插入图片描述

这是力扣上官方给出的一种方法,需要数学推导,比较难理解,解析给的是花里胡哨,添油加醋的,我大概概括一下就是把数组一串元素类比成莫比乌斯环,我们构图理解就简单多了(ppt手绘勿喷):

在这里插入图片描述

什么意思呢,就是我们就拿k作为遍历间隔,不断拿 1+nk(n从0开始) 位置的元素替代 1+ (n+1)k位置元素,直到回到原点,回到原点时因为遍历间隔>0,必定会有未遍历的元素我们只需+1 跳到下一位置继续上述操作,再使用另一单独变量,跟踪当前已经访问的元素数量,当该变量 = 元素数量时遍历完成,结束遍历过程。(个人理解,如有不当请联系我更正哟~)

int GCd(int a, int b) {
    return b ? gcd(b, a % b) : a;
}
void swap(int* a, int* b) {
    int t = *a;
    *a = *b, *b = t;
}
void rotate(int* nums, int numsSize, int k) {
    k = k % numsSize;
    int count = gcd(k, numsSize);
    for (int start = 0; start < count; ++start) {
        int current = start;
        int prev = nums[start];
        do {
            int next = (current + k) % numsSize;
            swap(&nums[next], &prev);
            current = next;
        } while (start != current);
    }
}

今天就到这里吧,摸了家人们,更多关于多方法超度旋转数组的资料请关注编程网其它相关文章!

--结束END--

本文标题: C语言双指针多方法旋转数组解题LeetCode

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

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

猜你喜欢
  • C语言双指针多方法旋转数组解题LeetCode
    目录暴力思路外加数组格局抬高环形替代LeetCode题目如下: 首先这个中等难度我是没搞懂,后面才发现原来中等中在要求多方法上,那就来看看怎么搞定他吧。 暴力思路 首先我说一下我本...
    99+
    2024-04-02
  • C语言例题讲解指针与数组
    目录1.概要复习2.指针与数组笔试题2.1一维数组2.2字符数组2.3字符串数组2.4字符串指针2.5二维数组1.概要复习 本篇的内容主要围绕指针与数组、指针与字符串等之间的关系,以...
    99+
    2024-04-02
  • C语言的数组指针与函数指针详解
    目录前言函数指针语法数组指针与指针数组总结前言 数组指针和函数指针都是C语言比较难的知识点,尤其是函数指针,并且函数指针在开发中有着巨大的作用。 函数指针语法 定义一个函数指针,并通...
    99+
    2024-04-02
  • c语言的指针数组详解
    指针如何指向数组,并读取数组中的元素: #include <stdio.h> int main() { int arr[3] = {1,2,3}; int *p;...
    99+
    2024-04-02
  • C语言详细讲解多维数组与多维指针
    目录一、指向指针的指针二、二维数组与二维指针三、数组名四、小结一、指向指针的指针 指针的本质是变量 指针会占用一定的内存空间 可以定义指针的指针来保存指针变量的地址值 为什么需要指向...
    99+
    2024-04-02
  • C语言指针数组案例详解
    指针与数组是 C 语言中很重要的两个概念,它们之间有着密切的关系,利用这种 关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之 间的联系及在编程中的应用。 1.指...
    99+
    2024-04-02
  • C语言 指针数组进阶详解
    目录指针与数组中的sizeof与strlensizeofstrlen数组名1、一维数组整型数组字符数组指针数组2、二维数组指针笔试题 笔试题1笔试题2笔试题3笔试题4笔试题...
    99+
    2024-04-02
  • C语言中指针和数组试题详解分析
    目录数组题:程序一(一维数组):字符数组程序二(字符数组):程序三(字符数组):程序四(字符数组):程序五(字符数组):二维数组程序六( 二维数组):指针题程序七( 指针):程序八(...
    99+
    2024-04-02
  • C语言基础双指针移除元素解法
    本题方法:双指针。知识比较基础,思路简单 题目: 我的题解: int removeElement(int* nums, int numsSize, int val) { ...
    99+
    2024-04-02
  • C语言详细讲解指针数组的用法
    目录1. 指针数组定义方法2. 指针的指针(二级指针)3. 字符串和指针4. 数组指针定义方法数组指针的用法1. 指针数组定义方法 格式: 类型说明符 *数组名[ 元素个数 ] in...
    99+
    2024-04-02
  • c语言的指针数组如何理解
    本篇文章给大家分享的是有关c语言的指针数组如何理解,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。指针如何指向数组,并读取数组中的元素:#include <std...
    99+
    2023-06-22
  • c语言指针数组赋值的方法是什么
    在C语言中,可以通过以下两种方式给指针数组赋值:1. 逐个赋值:可以使用循环结构逐个赋值指针数组的每个元素。例如:```int ar...
    99+
    2023-08-30
    c语言
  • C语言指针引用数组案例讲解
    前言:C语言中指针玩的是什么,是内存,要想学好指针的小伙伴们要先对数据在内存中是怎么玩的做一番了解~       当在...
    99+
    2024-04-02
  • C语言零基础讲解指针和数组
    目录一、指针和数组分析-上1.数组的本质2.指针的运算3.指针的比较4.小结二、指针与数组分析-下 1.数组的访问方式2.下标形式 VS 指针形式3.a 和 &a ...
    99+
    2024-04-02
  • C语言三种方法解决轮转数组问题
    目录题目1.题目描述2.要求3.原题链接二、相关知识点三、解决思路旋转法直接法空间换取时间题目 1.题目描述 给你一个数组,将数组中的元素向右轮转 k 个位置,其中&nbs...
    99+
    2024-04-02
  • C语言指针数组初始化的方法是什么
    C语言中,指针数组的初始化可以通过以下两种方式实现:1. 逐个初始化:可以使用类似于普通数组的方式逐个为指针数组的元素赋值。例如:c...
    99+
    2023-10-18
    C语言
  • C语言指针和数组深入探究使用方法
    目录1、数组参数和指针参数1.1 一维数组传参1.2 一级指针传参1.3 二维数组参数和二级指针参数1.4 野指针的问题2、函数指针3、函数指针数组4、指向函数数组的指针5、回调函数...
    99+
    2022-11-13
    C语言指针和数组 C语言指针 C语言数组
  • C语言sizeof和strlen的指针和数组面试题详解
    目录一、概念         sizeof:strlen:二、例题及解析2.1 一维数组2.2 字符数...
    99+
    2024-04-02
  • C语言详细讲解数组参数与指针参数
    目录一、C语言中的数组参数退化为指针的意义二、二维数组参数三、等价关系四、被忽视的知识点五、小结一、C语言中的数组参数退化为指针的意义 C 语言中只会以值拷贝的方式传递参数 当向函数...
    99+
    2024-04-02
  • C语言的数组与指针可以这样了解
    目录前言一、数组的定义二、数组空间的初始化1. char数组赋值2.char数组硬件开发规范二、数组与指针总结前言 自学笔记,没有历史知识铺垫(省略百度部分)C语言数组的概念及使用 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作