当前位置: 首页 > news >正文

数据结构与算法-数组(附阿里面试题)

  一 面试经典:

        给你一个文件里面包含全国人民(14亿)的年龄数据(0~180),现在要你统计每一个年龄   有多少人?
        给定机器为 单台+2CPU+2G内存。不得使用现成的容器,比如map等。(这一句可以忽略)
        在以上情况下你该如何以最高效的方法来解决这个问题?

试想下应该用什么,

        排序?(太耗内存,考虑时间复杂度,同时排序算法最高复杂度为O(nlogn))

        分布式?(例如hadoop的MapReduce的切开)-->大题小作,没必要

        答: 可以用数组。(开篇引题)

        实例代码:
package algorithm.array;import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;import javax.imageio.stream.FileImageInputStream;public class AgeStas {public static void main(String[] args) throws Exception {String str = null;String fileName = "E:\\javacode\\Array\\age1.txt";InputStreamReader isr = new InputStreamReader(new FileInputStream(fileName),"UTF-8");long start = System.currentTimeMillis();BufferedReader br = new BufferedReader(isr);int tot = 0 ;	//21亿int data [] = new int[200];while((str = br.readLine()) != null){		//一行一行的读 O(n)int age = Integer.valueOf(str);data[age] ++ ;tot ++ ;}//O(n) 14亿. 100万/秒 *1000 = 10亿 100~1000s之间 => 500s以下 60*8=480sSystem.out.println("总共的数据大小: " + tot);for(int i = 0 ; i < 200 ; i ++){//下标从0开始的System.out.println(i + ":" + data[i]);}//144239ms => 144sSystem.out.println("计算花费的时间为:" + (System.currentTimeMillis() - start) + "ms");}
}

       核心思想: 通过流的形式一行一行的读然后通过数组下标进行年龄各自累加。同时运行时间和电脑性能也有影响哦。一般100多秒差不多

       那么为什么使用数组呢?

        下标:数组最优一个特点。这里可以通下标表示成有意义的数据,不只是数据里面的标记,年龄和下标对应。

        随机访问:可以直接通过下标定位到数组中的某一个数据

 二 数组:

       1.定义 

        所谓数组,是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。这些无序排列的同类数据元素的集合称为数组。int 的数组你就不能存float 也不能存double
数组是用于储存多个相同类型数据的集合。通常用Array表示,也称之为线性表

        2. 特点

        (1)数组是相同数据类型的元素的集合。
        (2)数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。内存地址
        (3)数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,以此类推。

      (4)数组是连续的内存空间和相同类型的数据。正是因为这两个限制,它才有了一个非常重要的特性:随机访问。但有利就有弊,这两个限制也让数组的很多操作变得非常低效,比如要想在数组中删除、插入一个数据,为了保证连续性,就需要做大量的数据搬移工作。
随机访问的重要应用:查找,面试重点

        3.缺点

        缺点就是数组的插入与删除了,具体等会看数组代码,时间复杂度都是O(n).如果将一个数据插入到数组中的第k个位置,那么需要将k位置之后的所有数据后移。删除第N个位置的数据,那就需要将N后面的所有元素前移一位,刚好与插入相反。

        4.数组代码实现(crud+扩容)

package Array;/*** @author:Kevin* @create: 2023-08-12 11:06* @Description:*/public class Arraytest {private int size;		//数组的长度private int data[];private int index;		//当前已经存的数据大小public Arraytest(int size){		//数组的初始化过程this.size = size;data = new int[size];		//分配的内存空间{0,0,0,0,0}index = 0;}public void print(){System.out.println("index:" + index);for(int i = 0 ; i < size ; i++){System.out.print(data[i] + " ");}System.out.println();}public void insert(int loc,int n){		//时间复杂度 O(n);//TODO 这里判断需不需要扩容,如果插入的元素位置够的话就不需要扩容!!!if(index ++ < size){for(int i = size - 1; i > loc ; i --){	//为什么不能写size 0~size-1 如果loc是0 O(n),O(1)=>O(n)data[i] = data[i - 1];	//把数据往后移一个}data[loc] = n;}else {// 进行扩容操作int[] newData = new int[size * 2];for (int i = 0; i < loc; i++) {newData[i] = data[i];}newData[loc] = n;for (int i = loc; i < size; i++) {//这里注意,之所以是data[i]是因为数组下标从0开始,所以data[i]为插入元素的后一位newData[i + 1] = data[i];}data = newData;size = size * 2;index++;}}public void delete(int loc){	//O(n)for(int i = loc ; i < size ; i++){if(i != size - 1){		//怕越界所以加一个判断data[i] = data[i + 1];}else{data[i] = 0;			//默认为0 就是没存数据的}}index -- ;}public void update(int loc,int n){//O(1)data[loc] = n;}public int get(int loc){		//O(1)return data[loc];}public static void main(String[] args) {//ArrayListArraytest arraytest = new Arraytest(6);arraytest.insert(3,5);arraytest.print();}}

        

        三:数组与Arraylist怎么选择?

本质是一样的,都是数组。ArrayList是JDK封装了。不需要管扩容等操作
数组的话就要你全部操作


两者之间应该如何选用?:
不知道数据大小的肯定选ArrayList。
如果你知道数据的大小而且你又非常关注性能那就用数组。

数组最需要注意的就是越界:所以一定要多加判断,尤其是在开始和结束。测试的时候也一样注意头和尾。

所以对于开篇的那道算法题可以使用数组

相关文章:

数据结构与算法-数组(附阿里面试题)

一 面试经典&#xff1a; 给你一个文件里面包含全国人民&#xff08;14亿&#xff09;的年龄数据&#xff08;0~180&#xff09;&#xff0c;现在要你统计每一个年龄 有多少人&#xff1f; 给定机器为 单台2CPU2G内存。不得使用现成的容器&#xff0c;比如map等。&am…...

k8s集群网络插件搭建——————解决集群notready(k8s1.20版本,docker24)

前面已经提到&#xff0c;在初始化 k8s-master 时并没有网络相关配置&#xff0c;所以无法跟 node 节点通信&#xff0c;因此状态都是“NotReady”。但是通过 kubeadm join 加入的 node 节点已经在k8s-master 上可以看到。 那么&#xff0c;这个时候我们该怎么办呢&#xff1f;…...

有血有肉的PPT

1、PPT是Powerpoint缩写 2、引申的含义是Powerpoint Power(力量/能量&#xff09; Point(观点/要点) 3、用PPT做的文档是讲演稿&#xff0c;讲演的内容要有力度&#xff0c;之所以要去演讲是为了能够影响受众 4、其次演讲稿上的内容要列出要点、表明观点&#xff0c;所以一般P…...

使用C语言实现UDP消息接收

目录 简介:步骤:步骤 1: 创建套接字步骤 2: 接收消息步骤 3: 完成 函数及变量解释总结: 简介: 在网络通信中&#xff0c;UDP&#xff08;User Datagram Protocol&#xff09;是一种无连接协议&#xff0c;它提供了一种快速、高效的数据传输方法。本文将向您展示如何使用C语言编…...

图片加水印

基础 基于&#xff1a;https://github.com/chishaxie/BlindWaterMark#blindwatermark 前置 安装python&#xff0c;操作系统为ubuntu 18.04.4 server 说明&#xff1a;python2 不行&#xff0c;已验证不行的版本是2.7.17&#xff0c;建议使用ubuntu 18.04.4 server对应的py…...

Nginx代理接口访问返回404

Nginx代理接口访问返回404 一、背景 因为不同业务系统间有接口调用&#xff0c;存在跨域问题&#xff0c;为了解决同源策略&#xff0c;需要将接口通过nginx去转发&#xff0c;但是配置完后通过postman请求一直存在访问404的问题。 访问地址&#xff1a;https://a.test.com/n…...

湘大 XTU OJ 1097 排序 题解:c++ 函数库的使用 快速排序 归并排序 冒泡排序

一、链接 1097 排序 二、题目 Description N个整数&#xff0c;将其排序输出。 输入 第一行是一个整数K&#xff08;1<K<20&#xff09;&#xff0c;表示有多少个样例&#xff0c;每个样例的第一行是一个整数N&#xff08;1<N<1,000&#xff09;和一个字符X&…...

Stable Diffusion AI绘图教学

课程介绍下载 这门课程将教授学生使用Stable Diffusion AI绘图工具进行数据可视化和图形设计。学生将学习基本的绘图原理、数据分析技巧&#xff0c;以及如何使用Stable Diffusion AI创建高质量的图表和可视化作品。通过实践项目和案例研究&#xff0c;学生将提升绘图技能&…...

39、传输层的任务和协议

从本节内容开始&#xff0c;我们学习TCP/IP模型的传输层的知识。传输层是TCP/IP模型中的重要组成部分&#xff0c;如果没有传输层的处理&#xff0c;那么源主机发送的IP数据包到达目的主机之后&#xff0c;目的主机将不知道这个数据是哪个应用程序的数据&#xff0c;就不能很好…...

系统架构设计专业技能 · 网络规划与设计(三)【系统架构设计师】

系列文章目录 系统架构设计专业技能 网络规划与设计&#xff08;三&#xff09;【系统架构设计师】 系统架构设计专业技能 系统安全分析与设计&#xff08;四&#xff09;【系统架构设计师】 系统架构设计高级技能 软件架构设计&#xff08;一&#xff09;【系统架构设计师…...

使用Matplotlib判断鼠标是否点击在当前线上的详细指南

系列文章目录 文章目录 系列文章目录前言一、导入必要的库二、创建图表和线条三、定义鼠标点击事件处理函数四、显示图表总结前言 Matplotlib是一个强大的绘图库,用于在Python中创建各种类型的图表和可视化。本文将详细介绍如何使用Matplotlib来判断鼠标是否点击在当前线上,…...

http get、post、put

HTTP协议定义了多种请求方法,用于不同的操作。最常见的有 GET、POST 和 PUT。 GET:GET 是最常用的方法,通常用于请求服务器发送某个资源。GET 请求只通过 URL 传送数据,数据信息会附在 URL 之后,以参数的形式附加。由于这种传送方式的限制,GET 请求的数据量较小,且安全性…...

仅使用 CSS 创建打字机动画效果

创建打字机效果比您想象的要容易。虽然实现这种效果的最常见方法是使用 JavaScript&#xff0c;但我们也可以使用纯 CSS 来创建我们的打字机动画。 在本文中&#xff0c;我们将了解如何仅使用 CSS 创建打字机动画效果。它简单、漂亮、容易。我们还将看看使用 CSS 与 JavaScrip…...

pytest fixture 高级使用

一、fixture中调用fixture 举例&#xff1a; 输出&#xff1a; 说明&#xff1a;登录fixture 作为参数传递到登出方法中&#xff0c;登录方法的返回值就可以被登出方法使用 二、在fixture中多参数的传递&#xff08;通过被调用函数传参&#xff09; 举例&#xff1a; 输出&a…...

远程控制医疗行业应用解析:如何满足医院合规需求?

远程控制医疗行业应用解析&#xff1a;如何满足医院合规需求&#xff1f; 作为一个起源于IT行业的技术&#xff0c;以远程桌面为基础的远程控制技术目前在医疗领域也已经有了比较广阔的应用前景&#xff0c;尤其是在医疗数字化系统/设备的远程运维场景&#xff0c;已经有了一些…...

【C++】开源:glog日志库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍glog日志库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次…...

使用 React Native CLI 创建项目

React Native 安装的先决条件和设置 需要掌握的知识点 掌握 JavaScript 基础知识掌握 React 相关基础知识掌握 TypeScript 相关基础知识 安装软件前需要首先安装Chocolatey。Chocolatey 是一种流行的 Windows 包管理器。 安装 nodejs 和 JDK choco install -y nodejs-lts …...

在R中将列表(list)转换为向量(vector)

问题&#xff1a;将列表中的所有元素“展平”&#xff0c;赋值给一个向量 解决方案&#xff1a;使用unlist()函数&#xff1b; 在许多情况下需要向量&#xff0c;例如&#xff0c;baseR中的许多统计函数需要一个向量作为输入&#xff0c;例如&#xff0c;如果iq.score是一个包…...

access怎么做进销存?借助access开发进销存管理应用

我不太推荐使用Access&#xff0c;因为他的缺点还是比较明显的&#xff1a; 1、软件自身限制 不能用于互联网&#xff1a;使用Access制作好的管理软件&#xff0c;访问页只能在局域网中使用&#xff1b;只能在Windows上运行&#xff1a;Access仅支持windows的运行环境&#x…...

css实现卡片的左上角有一个三角形的遮盖效果

需求: 卡片的左上角有一个绿色的三角形标签,用来区分状态 实现: .vCard{position: relative;overflow: hidden; } .vCard::before {content: "";position: absolute;top: 0;left: 0;width: 0;height: 0;border-bottom: 20px solid transparent;border-left: 20px …...

Docker容器在产线崩溃的7种隐性原因:从cgroup泄漏到时钟漂移,一文定位真凶

第一章&#xff1a;Docker容器在产线崩溃的7种隐性原因&#xff1a;从cgroup泄漏到时钟漂移&#xff0c;一文定位真凶生产环境中&#xff0c;Docker容器看似“一键启停”&#xff0c;实则深藏七类不易察觉的崩溃诱因。它们不触发明显错误日志&#xff0c;却在高负载、长周期运行…...

RS485通信冲突?手把手教你用C语言实现一个简单的“软件仲裁”驱动库

RS485通信冲突的软件仲裁解决方案&#xff1a;从原理到C语言实现 在工业自动化、智能楼宇等场景中&#xff0c;RS485总线因其抗干扰能力强、传输距离远等优势被广泛应用。但当多个设备同时尝试发送数据时&#xff0c;总线冲突问题便成为工程师们头疼的难题。与CAN总线不同&…...

IPv6

第一部分&#xff1a;为什么要有IPv6&#xff1f;&#xff08;先解决“IPv4是什么”&#xff09; 想象一下&#xff0c;全世界的电脑、手机、服务器要互相通信&#xff0c;就像寄信需要门牌号。这个门牌号在互联网里叫 IP地址。 IPv4&#xff1a;就是使用了30多年的老门牌号系…...

WarcraftHelper:让经典魔兽争霸3在现代电脑上焕发新生的终极优化方案

WarcraftHelper&#xff1a;让经典魔兽争霸3在现代电脑上焕发新生的终极优化方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还在为《魔兽争…...

告别哑巴设备:用STM32和SYN6288给你的DIY项目加上“嘴巴”

STM32与SYN6288语音模块&#xff1a;为智能硬件注入交互灵魂 在创客的世界里&#xff0c;让一个LED灯闪烁或读取传感器数据只是起点。真正的魔法发生在当你的作品能够与人对话——"电量剩余20%&#xff0c;请及时充电"、"检测到前方障碍物"、"室内温度…...

python passlib

# 聊聊 Python 里的密码管理工具&#xff1a;Passlib 在 Python 项目里处理用户密码&#xff0c;是件需要格外小心的事。密码不能明文存储&#xff0c;得加密&#xff0c;但加密的方式又有很多种&#xff0c;选错了或者用错了&#xff0c;都可能留下安全隐患。这些年&#xff0…...

高德/百度地图API实战:如何用AOI数据给你的POI打上“商圈”标签?

高德/百度地图API实战&#xff1a;如何用AOI数据为POI智能标注商圈标签&#xff1f; 在本地生活服务领域&#xff0c;精准的商圈划分直接影响着用户推荐效果和商业决策质量。想象一下&#xff0c;当用户搜索"附近网红餐厅"时&#xff0c;系统如果能基于商圈维度而非简…...

手把手教你用CarMaker 10.2和Matlab R2021a搭建联合仿真环境(附避坑指南)

从零开始构建CarMaker与Simulink联合仿真环境的完整指南 当车辆动力学仿真遇到控制系统设计&#xff0c;CarMaker与Simulink的联合仿真环境就像给工程师装上了涡轮增压器。这个强大的组合允许你在高度逼真的虚拟测试环境中验证控制算法&#xff0c;而无需等待物理原型。想象一下…...

告别预编译库!手把手教你为C++ 3D可视化项目定制编译OpenCV+VTK开发环境

告别预编译库&#xff01;手把手教你为C 3D可视化项目定制编译OpenCVVTK开发环境 在计算机视觉和三维重建领域&#xff0c;OpenCV的viz模块为开发者提供了强大的3D可视化能力。然而&#xff0c;许多开发者在使用预编译的OpenCV库时&#xff0c;常常会遇到一个令人头疼的问题——…...

CMake条件判断避坑指南:从‘23a EQUAL 23’的诡异结果说起

CMake条件判断避坑指南&#xff1a;从‘23a EQUAL 23’的诡异结果说起 在构建系统的世界里&#xff0c;CMake就像一位经验丰富但脾气古怪的老管家——它总能完成任务&#xff0c;但偶尔会以出人意料的方式执行您的指令。特别是当您开始深入使用条件判断时&#xff0c;那些看似简…...