数据结构算法 数组的实现与练习(C语言实现,Java实现)

文章目录

  • 数据结构
  • 数组(顺序表)
    • 特点
    • 使用Java实现更高级的数组
    • C语言实现
    • 总结
      • 优点
      • 缺点
    • 例题
      • [26. 删除有序数组中的重复项](https://leetcode.cn/problems/remove-duplicates-from-sorted-array/)
      • [1. 两数之和](https://leetcode.cn/problems/two-sum/)
      • [27. 移除元素](https://leetcode.cn/problems/remove-element/)
      • [153. 寻找旋转排序数组中的最小值](https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/)
      • [485. 最大连续 1 的个数](https://leetcode.cn/problems/max-consecutive-ones/)
      • [414. 第三大的数](https://leetcode.cn/problems/third-maximum-number/)
      • [2656. K 个元素的最大和](https://leetcode.cn/problems/maximum-sum-with-exactly-k-elements/)
      • [LCP 06. 拿硬币](https://leetcode.cn/problems/na-ying-bi/)
      • [2057. 值相等的最小索引](https://leetcode.cn/problems/smallest-index-with-equal-value/)
      • [26. 删除有序数组中的重复项](https://leetcode.cn/problems/remove-duplicates-from-sorted-array/)
      • [2125. 银行中的激光束数量](https://leetcode.cn/problems/number-of-laser-beams-in-a-bank/)
      • [27. 移除元素](https://leetcode.cn/problems/remove-element/)
      • [1431. 拥有最多糖果的孩子]

数据结构

数组(顺序表)

  • 一组相同数据类型的集合
  • image-20240530125359725

特点

  1. 数组在内存中是连续分配的 如上图
  2. 创建时要指明数组的大小
  3. 数组名代表首地址,索引从0开始,到数组的长度-1
  4. 数组一旦创建好,大小不可以改变
  5. 使用索引
    1. 获取索引位置的值 arr[index]
    2. 修改 arr[index] = val
    3. 删除 (假删除)就是把目标元素后面的元素向前位移一格
      1. image-20240530125701713
    4. 遍历,将数组中的元素,依次打印出来

使用Java实现更高级的数组

import java.util.Random;public class MyArr<T> {private int capacity = 0;private int size = 0;private T[] arr;public MyArr(int capacity) {if (capacity < 0) this.capacity = 10; //if no right input, we will initial capacity 10this.capacity = capacity;this.arr = (T[]) new Object[capacity];}public int getCapacity() {return capacity;}public int getSize() {return size;}public T[] setCapacity(int capacity) {if (capacity < 0) {throw new RuntimeException("扩大小异常");}this.capacity = capacity;T[] newNum = (T[]) new Object[capacity];for (int i = 0; i < this.size; ++i) {newNum[i] = this.arr[i];}return newNum;}//增加元素public void add(T val) {if (this.size >= this.capacity) {this.arr = setCapacity(2 * this.capacity);}this.arr[this.size++] = val;}//删除元素public boolean removeByIndex(int index) {if (index < 0 || index > this.capacity) {throw new RuntimeException("数组越界");}for (int i = index; i < size - 1; ++i) {arr[i] = arr[i + 1];}size--;if (size < this.capacity / 4 && this.capacity > 4) {arr = setCapacity(this.capacity / 4);}return true;}//修改位置元素public void modify(int index, T val) {if (index < 0 || index > size - 1) {throw new RuntimeException("数组越界");}arr[index] = val;}//获取某元素位置public int locateVal(T val) {for (int i = 0; i < size; ++i) {if (arr[i] == val) {return i;//return index}}// if no find return -1return -1;}//打印元素@Overridepublic String toString() {StringBuffer stringBuffer = new StringBuffer();stringBuffer.append('[');for (int i = 0; i < this.size - 1; ++i) {stringBuffer.append(arr[i] + ",");}if(size>0) stringBuffer.append(arr[size - 1]);stringBuffer.append(']');return stringBuffer.toString();}}

C语言实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <stdlib.h> // 添加头文件以使用malloc和free函数
#define ERROR 0
#define OK 1
#define MAXLENGTH 20
#define List_Increment 10typedef int Status;//判断程序是否运行成功 0-失败 1-成功
typedef int Element;
typedef struct {Element* location;int length;//存储数据结构数组长度int listsize;//
}SqList;//初始化顺序表
Status initiElem(SqList *L) {//L->location =  Element stu[20];L->location =  (Element*)malloc(MAXLENGTH*sizeof(Element));L->length = 0 ;L->listsize = 0;if (L->location == NULL) {return ERROR ;//申请内存失败}return OK;//申请内存成功}
//插入元素
Status insertElem(SqList* L, int i, Element e) {if (L->length == MAXLENGTH) return ERROR;//表饱和if (i<1 || i>L->length + 1) return ERROR;if (i <= L->length) {for (int j = L->length - 1; j >= i - 1; j--) {L->location[j + 1] = L->location[j + 1];}L->location[i-1] = e;L->length++;//长度+1}//若i在末尾直接插入L->location [i - 1] = e;L->length++;//长度+1return OK;
}//查找元素
int findElem(SqList L, Element e) {for (int i = 0; i < L.length; i++) {if (L.location[i] == e) {return i + 1;//返回第i个元素}}return ERROR;}
//获取元素
Status getElem(SqList L, int i, Element* e) {if (i < 1 || i>L.length )return ERROR;e = L.location[i];//把第i各元素返回给Element类型数据return OK;
}
//删除操作
Status deleElem(SqList* L, int i) {if (L->length == 0)return ERROR;//此时为空表if (i<1 || i>L->length) return ERROR;//位置不合理//删除后面元素前移for (int j = i; j < L->length;j++) {L->location[j - 1] = L->location[j];}L->length--;return OK;//删除成功
}int main1() {SqList L;Element element=0;int choice;int index;//插入位置while (OK) {printf("---欢迎使用链表查询系统-----\n");printf("--------1-初始化链表--------\n");printf("--------2-插入链表元素------\n");printf("--------3-查找元素----------\n");printf("--------4-删除元素----------\n");printf("--------5-获取元素----------\n");printf("--------6-遍历元素----------\n");printf("--------7-退出系统----------\n");scanf("%1d", &choice);switch (choice){case 1://调用initiElem函数开始初始化if (initiElem(&L) == NULL) {printf("初始化失败!\n");return ERROR;}printf("初始化成功!\n");break;case 2:printf("请输入你想插入的元素(整数):\n");scanf("%d", &element);printf("请输入你想插入的位置:\n");scanf("%d", &index);if (insertElem(&L, index, element) == 0) {printf("插入失败!\n");break;}printf("插入成功!\n");break;case 3:printf("请输入你想查找的元素(整数):\n");scanf("%d", &element);if (findElem(L,element) == 0) {printf("查找失败\n");break;}printf("该元素在第%d个位置\n", findElem(L,element));break;case 4:printf("请输入你想删除的元素(位置):\n");scanf("%d", &index);if (deleElem(&L,index) == 0) {printf("删除失败!\n");break;}printf("删除成功!\n");break;case 5:printf("请输入你想获取元素的位置:\n");scanf("%d", &index);if (getElem(L, index, &element) == 0) {printf("获取失败!");break;}printf("第%d的元素为 %d", index + 1, element);break;case 6:if (L.length == 0) {printf("为空表,无法遍历");break;}for (int i = 0; i < L.length; i++) {printf("%d\n", *(L.location+i));}break;default:break;}}
}

总结

优点

1.由于是根据下表查找数据,则数组(顺序表)查找速度快时间复杂度O(1)

缺点

1.因为每次删除元素,或者插入数组时,每个数据都需要向后或者向前位移则平均时间复杂度为O(n),所以插入或删除速度慢

例题

26. 删除有序数组中的重复项

1. 两数之和

27. 移除元素

153. 寻找旋转排序数组中的最小值

485. 最大连续 1 的个数

414. 第三大的数

2656. K 个元素的最大和

LCP 06. 拿硬币

2057. 值相等的最小索引

26. 删除有序数组中的重复项

2125. 银行中的激光束数量

27. 移除元素

[1431. 拥有最多糖果的孩子]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

破解生产难题,这些中小汽配企业这样做

伴随着汽车新四化即智能化、网联化、电动化、共享化的趋势,国内汽车零部件行业在市场规模和发展速度上呈现高速增长。然而&#xff0c;在劳动力成本上升,原材料价格上涨,企业生产成本逐年增加的情境下&#xff0c;市场竞争越来越激烈&#xff0c;如何降本增效&#xff0c;还能构…

三十二篇:转化决策为行动:探索决策支持系统的深层价值

转化决策为行动&#xff1a;探索决策支持系统的深层价值 1. DSS的精髓&#xff1a;定义与核心功能 1.1 定义与作用 在现代商业的快速演变中&#xff0c;决策支持系统&#xff08;Decision Support Systems, DSS&#xff09;已成为企业获得竞争优势的重要工具。DSS是一种利用先…

【R语言基础】如何更新R版本

文章目录 概要流程细节具体步骤 概要 提示&#xff1a;由于软件包的更新&#xff0c;所以需要更新R至新版本 流程细节 查看当前R版本 R.version下载更新包&#xff1a;installr install.packages("installr")library(installr)跟着向导一步步执行安装 具体步骤 …

HTML5的标签(文本链接、图片路径详解)

目录 前言 一、文本链接 超链接表述 二、图片路径详解 绝对路径 相对路径 网络路径 前言 一、文本链接 超链接表述 HTML 使用标签<a>来设置超文本链接 超链接可以是一个字&#xff0c;一个词&#xff0c;或者一组词&#xff0c;也可以是一幅图像&#xff0c;…

本地电脑通过远程服务器进行ssh远程转发

☆ 问题描述 想要实现这样一个事情&#xff1a; 我想要提供一个ai服务&#xff0c;但是租计算服务器太贵了&#xff0c;我自己有配的台式机。那么用我的台式机作为服务器&#xff0c;租一个服务器做端口转发可行吗&#xff1f; ★ 解决方案 1. 修改服务器上的sshd_config文件…

如何格式化只读U盘?

U盘只读无法格式化&#xff0c;该怎么处理&#xff1f;别担心&#xff01;本文将向你提供一些实用方法&#xff0c;助你解决U盘写保护的难题。这些方法能有效帮助你解除U盘的只读状态&#xff0c;从而可以顺利进行格式化和其他操作。 不能格式化只读U盘 “我购买了一个U盘&…

vmware esxi虚拟化数据迁移

1、启用esxi的ssh 登录esxi的web界面&#xff0c;选择主机-》操作——》服务——》启动ssh 2.xshell登录esxi 3、找到虚拟机所在目录 blog.csdnimg.cn/direct/d57372536a4145f2bcc1189d02cc7da8.png)#### 3在传输数据前需关闭防火墙服务 查看防火墙状态&#xff1a;esxcli …

系统架构设计师【第8章】: 系统质量属性与架构评估 (核心总结)

文章目录 8.1 软件系统质量属性8.1.1 质量属性概念8.1.2 面向架构评估的质量属性8.1.3 质量属性场景描述 8.2 系统架构评估8.2.1 系统架构评估中的重要概念8.2.2 系统架构评估方法 8.3 ATAM方法架构评估实践8.3.1 阶段1—演示&#xff08;Presentation&#xff09;8.3…

卷积网络迁移学习:实现思想与TensorFlow实践

摘要&#xff1a;迁移学习是一种利用已有知识来改善新任务学习性能的方法。 在深度学习中&#xff0c;迁移学习通过迁移卷积网络&#xff08;CNN&#xff09;的预训练权重&#xff0c;实现了在新领域或任务上的高效学习。 下面我将详细介绍迁移学习的概念、实现思想&#xff0c…

堆排序详细理解

目录 一、前备知识 二、建堆 2.2.1 向上调整算法建堆 2.2.2 向下调整算法建堆 三、排序 3.1 常见问题 3.2 思路 3.3 源码 一、前备知识 详细图解请点击&#xff1a;二叉树的顺序实现-堆-CSDN博客 本文只附上向上/向下调整算法的源码 //交换 void Swap(int* p, int* …

发电机组故障的原因、解决方案及解决措施

发电机组故障的原因、解决方案及解决措施可以总结如下&#xff1a; 一、故障原因 供电中断 原因&#xff1a;电网故障、线路短路或电力负荷过重等。 燃油问题 原因&#xff1a;燃油供应系统问题&#xff0c;如燃油管路堵塞、燃油质量不佳等。 轴承过热 原因&#xff1a;轴承过…

TensorFlow Playground神经网络演示工具使用方法详解

在现代机器学习领域,神经网络无疑是一个重要的研究方向。然而,对于许多初学者来说,神经网络的概念和实际操作可能显得相当复杂。幸运的是,TensorFlow Playground 提供了一个交互式的在线工具,使得我们可以直观地理解和实验神经网络的基本原理。在这篇博客中,我们将详细介…

长虹智能电视55D3P(机芯:ZLH74GiR2G)海思平台固件解析打包

一、使用Hitool打包固件 接上一篇&#xff0c;尝试使用HITOOL打包固件 长虹55D3P海思平台固件破解-CSDN博客 参考ZNDS HItool备份固件&#xff1a;【玩机必看】海思机顶盒备份线刷包 制作分区表xml文件_ZNDS刷机/救砖_ZNDS HITOOL下载&#xff1a;https://cloud.189.cn/web/…

Visual Studio 2022创建dll并调用

需求&#xff1a; 创建A项目&#xff0c;有函数和类&#xff0c;将A项目生成DLL动态链接库 创建B项目&#xff0c;使用A项目生成的dll和lib相关文件 正常项目开发.h用于函数声明&#xff0c;.cpp用于函数实现&#xff0c;但是项目开发往往不喜欢将.cpp函数实现的代码发给别人&…

Elasticsearch 认证模拟题 - 5

一、题目 .在集群上有一个索引 food_ingredient&#xff0c;搜索需要满足以下要求&#xff1a; 三个字段 manufacturer&#xff0c;name&#xff0c;brand 都能匹配到文本 cake mix高亮 字段 name&#xff0c;并加标签排序&#xff0c;对字段 brand 正序&#xff0c;_score 降…

Docker安装Redis(云服务器)

准备&#xff1a; 在云服务器中开启6370端口号 docker run -d --name redis -p 6379:6379 redis 这条命令使用docker运行一个名为"redis"的容器&#xff0c;映射容器的6379端口到主机的6379端口&#xff0c;并且使用redis镜像来运行容器。REDIS是一个开源的内存数据…

2024最新群智能优化算法:大甘蔗鼠算法(Greater Cane Rat Algorithm,GCRA)求解23个函数,提供MATLAB代码

一、大甘蔗鼠算法 大甘蔗鼠算法&#xff08;Greater Cane Rat Algorithm&#xff0c;GCRA&#xff09;由Jeffrey O. Agushaka等人于2024年提出&#xff0c;该算法模拟大甘蔗鼠的智能觅食行为。 参考文献 [1]Agushaka J O, Ezugwu A E, Saha A K, et al. Greater Cane Rat Alg…

C++ 混合运算的类型转换

一 混合运算和隐式转换 257 整型2 浮点5 行吗&#xff1f;成吗&#xff1f;中不中&#xff1f; C 中允许相关的数据类型进行混合运算。 相关类型。 尽管在程序中的数据类型不同&#xff0c;但逻辑上进行这种运算是合理的相关类型在混合运算时会自动进行类型转换&#xff0c;再…

2024Dragon Knight CTF复现web

穿梭隐藏的密钥 首先看看页面的源代码&#xff0c;但是发现f12和鼠标右键都被禁用了 用ctrlu查看&#xff0c;发现一个可疑页面 访问看看&#xff0c;发现还是只有一张图&#xff0c;查看源代码发现提示 扩展&#xff1a; Fuzz&#xff1a;Fuzz是一种基于黑盒的自动化软件模糊…

TXT文档拆分、合并、添加内容,修改内容、删除内容——首助编辑高手软件一招解决

下面这个TXT文档里面是一篇长篇小说&#xff0c;大家都知道一般小说文字内容是比较大的一个文件呢&#xff0c;想要拆分&#xff0c;拆分肯定是有方法呢&#xff0c;比如比较重统的方法手动一章一章复制出来&#xff0c;粘贴到另一个文档里面去粘贴&#xff0c;手动操作是不是很…