《大数据开发面试题-附答案.pdf》由会员分享,可在线阅读,更多相关《大数据开发面试题-附答案.pdf(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、大数据开发面试题附答案以下为面试过程中提问,岗位为大数据开发:.自我介绍+项目介绍.为什么用 kafkas sparkstreaming、h b ase?有什么替代 方 案 吗?.聊聊你觉得大数据的整个体系?.你 看 过 h d fs 源 码?n n 的高可用说一下.zo o keep er简单介绍一下,为 什 么 要 用 zk?z k 的架构?zab?.h b a se 的 架 构,读 写 缓 存?.b lo ckcache的底层实现?你提到了 L R U 那除了L R U 还可以有什么方案?.聊聊 sparkstreaming 和 flink?flink 流批一体解释一 下?.s p a
2、rk 的 几 种 sh u ffle 说 下?为什么要丢弃hashshuffle?.java g c 可达性分析+垃圾回收器+垃圾回收算法+为什么分代垃圾回收+调优.数 据 库 引 擎,in n o d b 索引实现+聚集和非聚集区别+为什 么 用 b+树 不 用 hash.聊 聊t c p和u d p的区别.h ttp知 道 吗?说一下.h ttp版本之间的比较.让 你 设 计 一 个h ash表,怎么设计?.时间不多了,手橹一个二分查找答案解析本文首发公众号【五分钟学大数据】,可以搜索关注 下,超多大数据精品文章1.自我介绍+项目介绍自我介绍可以参考美团面试的这篇文章:美团优选大数据开发岗
3、面试题2.为什么用kafka、sparkstreaming、hbase?有什么替代方案吗?根据简历中写的项目,谈谈为什么用这几个框架,是公司大数据平台历史选择还是更适合公司业务。然后在说下每个框架的优点:Kafka:高吞吐量、低 延 迟:kafka每秒可以处理几十万条消息、,它的延迟最低只有几毫秒;.可 扩 展 性:k a fk a 集群支持热扩展;.持久性、可 靠 性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失;容 错 性:允许集群中节点故障(若 副 本 数 量 为 n,则允许n-1 个节点故障);高 并 发:支持数千个客户端同时读写。K a fk a 应 用 场 景:.日志收集:
4、一 个 公 司 可 以 用 K a fk a 可以收集各种服务的lo g,通 过 k a fk a 以统一接口服务的方式开放给各种consumer;消 息 系 统:解耦生产者和消费者、缓存消息等;.用户活动跟踪:k a fk a 经 常 被 用 来 记 录 w e b 用户或者a p p 用户的各种活动,如浏览网页、搜索、点 击 等 活 动,这些活动信息被各个服务器发布到k a fk a 的 to p ic 中,然后消费者通过订阅这些to p ic 来做实时的监控分析,亦可保存到数据库;.运 营 指 标:k a fk a 也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的
5、集中反馈,比如报警和报告;流 式 处 理:比 如 spark stream in g 和 flinkoSpark Streaming 优点:spark stream in g 会 被 转 化 为 s p a rk 作 业 执 行,由于s p a rk 作 业 依 赖 DAGScheduler和RDD,所以是粗粒度方式而不是细粒度方式,可以快速处理小批量数据,获得准实时的特性;以 s p a rk 作业提交和执行,很方便的实现容错机制;D Stream ing是 在 R D D 上 的 抽 象,更 容 易 与 RDD进行交互操作。需要将流式数据与批数据结合分析的情况下,非常方便。因为我们的业务对
6、实时性要求不是特别高,所 以 使 用 sparkstream in g 是非常合适的。H B a se 优 点:H D F S 有 高 容 错,高扩展的特点,而H b a se 基于H D F S 实现数据的存储,因 此 H b a se 拥有与生俱来的超强的扩展性和吞吐量。H B a se 采 用 的 是 K ey/V alu e的存储方式,这 意 味 着,即便面临海量数据的增长,也几乎不会导致查询性能下降。H B a se 是一个列式数据库相对于于传统的行式数据库而言。当你的单张表字段很多的时候,可以将相同的列(以re g in 为单位)存在到不同的服务实例上,分散负载压力。有什么替代方案
7、,就可以聊聊和这几个功能类似的框架,它们的优缺点等,比 如Apache kafka对 应 的Apache Pulsar;Spark Stream ing对 应 的Flink;H Base对应的列式数据库可以举几个例子,如Cassandra.M ongoDB等。3.聊聊你觉得大数据的整个体系?这个是一个开放性题,把你知道的大数据框架都可以说下,下 面 是 我 做 的 一 个Apache大数据框架的集合图,当然也没有 包 含 全 部,只是比较常见的几个:SparkFlumeSqoop0 0 0 0OozieKuduDorisDruidHudiaAtlas-0说的时候尽量按照它们的功能划分及时间先后
8、顺序讲解。4.你 看 过 h d fs源码?n n 的高可用说一下一 个 N am eN ode有单点故障的问题,那就配置双NameNode,配置有两个关键点,一是必须要保证这两个N N 的元数据信息必须要同步的,二 是 一 个 N N 挂掉之后另一个要立马补上。.元 数 据 信 息 同 步 在 H A 方案中采用的是“共享存储。每次写文件时,需要将日志同步写入共享存储,这个步骤成功才能认定写文件成功。然后备份节点定期从共享存储同 步 日 志,以便进行主备切换。.监 控 N N 状 态 采 用 zookeeper,两 个 N N 节点的状态 存 放 在 Z K 中,另 外 两 个 N N 节点
9、分别有一个进程监控 程 序,实 施 读 取 Z K 中 有 N N 的 状 态,来判断当前的N N 是 不 是 已 经 d o w n 机。如 果 sta n d b y的N N 节点 的 Z K F C 发现主节点已经挂掉,那么就会强制给原本的 active N N 节点发送强制关闭请求,之后将备用的N N 设 置 为 activeo如 果 面 试 官 再 问 H A 中 的 共 享 存 储 是 怎 么 实现的知道吗?可以进行解释下:N am eN ode共享存储方案有很多,比如 Linux HA,VMware FT,QJM 等,目前社 区 已 经 把 由 C lo u d erea公 司
10、实 现 的 基 于 QJM(Quorum Journal Manager)的方案合并到H D F S 的 tru n k 之中并且作为默认的共享存储实现基 于 Q JM 的共享存储系统主要用于保存EditLog,并不保存 FSImage 文件。FSImage 文件 还 是 在 N am eN ode的本地磁盘上。Q JM 共享存 储 的 基 本 思 想 来 自 于 P a x o s算 法,采用多个称为 JournalNode 的节点组成的 JournalNode集 群 来 存 储 EditLog。每 个 JournalN ode保存同 样 的 E d itLo g 副本。每次 N am eN
11、 ode写E d itLo g 的 时 候,除 了 向 本 地 磁 盘 写 入 EditLog之 外 也 会 并 行 地 向 JournalN ode集群之中的每一 个 JournalN ode发送写请求,只要大多数(m a jo rity)的 JournalN ode节点返回成功就认为 向 JournalN ode集 群 写 入 Ed itLo g 成功。如果 有 2N+1 台 JournalNode,那么根据大多数的 原 则,最 多 可 以 容 忍 有 N 台 JournalN ode节点挂掉注:H adoop3.x允 许 用 户运行 多 个 备 用 NameNode。例 如,通 过 配
12、置 三 个 N am eN ode和 五 个 JournalN ode,群集能够容忍两个节点而不是一个节点的故障。H D F S 的其他内容可看之前写的这篇文章:H D F S 分布式文件系统详解5.zookeeper简单介绍一下,为什么要用zk?z k 的架构?zab?z k 介 绍 及 功 能:Zookeeper是一个分布式协调服务的开源框架。主要用来解决分布式集群中应用系统的一致性问题,例如怎样避免同时操作同一数据造成脏读的问题。ZooKeeper本质上是一个分布式的小文件存储系统。提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理。从而用来维护和监控你存储的
13、数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。诸 如:统一命名服务(dubb。)、分布式配置管理缶。卜的配置集中管理)、分布式消息队列(sub/pub),分布式锁、分布式协调等功能。z k 架 构:z k 架 构 图:Leader:Zookeeper集群工作的核心;事 务 请 求(写 操 作)的唯一调度和处理者,保证集群事务处理的顺序性;集群内部各个服务器的调度者。对 于create,setData,delete等有写操作的请 求,则 需 要 统 一 转 发 给leader处 理,leader需要决定编号、执 行 操 作,这个过程称为一个事务。Follower:处
14、理客户端非事务(读 操 作)请 求,转 发 事 务 请 求 给Leader;参 与 集 群Leader选 举 投 票2 n-l台可以做集群投票。此 外 针 对 访 问 量 比 较 大 的 zo o keep er集 群,还可新增观察者角色。Observer:观 察 者 角 色,观 察 Zo o keeper集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求,则会转发给Le a d e r服务器进行处理。不会参与任何形式的投票只提供非事务服务,通常用于在不影响集群事务处理能力的前提下提升集群的非事务处理能力。简 答:说白了就是增加并发的读请求Z A B 协 议
15、 全 称:Zookeeper Atomic Broadcast(Zookeeper原子广播协议)oZ A B 协 议 是 专 门 为 zo o keep er实现分布式协调功能而设计。zo o keep er主 要 是 根 据 Z A B 协议是实现分布式系统数据一致性。zo o keep er根 据 Z A B 协议建立了主备模型完成zo o keep er集群中数据的同步。这里所说的主备系统架构模型 是 指,在 zo o keep er集 群 中,只 有 一 台 le a d e r负责处理外部客户端的事物请求(或写操作),然 后 le a d e r服务器将客户端的写操作数据同步到所有的
16、fo llo w e r节点中。6.HBase的 架 构,读写缓存?H B a se 的架构可以看这篇文章,非 常 详 细:H B a se 底层原理详解下 面 说 下 H B a se 的 读 写 缓 存:H B a se 的RegionServer的缓存主要分为两个部分,分别是 MemStore 和 BlockCache,其中 MemStore 主要用于写 缓 存,而BlockCache用于读缓存。H B a se 执行写操作首先会将数据写入MemStore,并顺序写 入 HLog,等满足一定条件后统一将M em Store中数据刷 新 到 磁 盘,这种设计可以极大地提升H B a se
17、的写性能。不 仅 如 此,M em Store对于读性能也至关重要,假如没有MemStore,读取刚写入的数据就需要从文件中通过1 0 查找,这种代价显然是昂贵的!BlockCache称 为 读 缓 存,H B a se 会将一次文件查找的B lo c k 块 缓 存 到 C a c h e 中,以便后续同一请求或者邻近数据 查 找 请 求,可以直接从内存中获取,避 免 昂 贵 的 I。操作。7.BlockCache的底层实现?你提到了 LRU那除了 LRU还可以有什么方案?我们知道缓存有三种不同的更新策略,分 别 是FIFO(先入先出)、LRU(最 近 最少使用)和LFU(最近最不常使用)。
18、H Base的b lo ck默 认 使 用 的 是LR U策 略:LRUBIockCacheo 止 匕 夕 卜 还 有 BucketCache.SlabCache(止 匕缓 存 在0.9 8版本已经不被建议使用)LRUBIockCache 实现机制:LRUBIockCache 是 HBase 目前默认的 BlockCache 机制,实现机制比较简单。它 使 用 一 个ConcurrentHashMap管 理BlockKey至!B lo ck的映射关系,缓 存B lo ck只需要 将BlockKey和 对 应 的B lo ck放 入 该HashM ap中,查询 缓 存 就 根 据BlockKey
19、从HashM ap中获取即可。同时该方案采用严格的L R U淘 汰 算 法,当Block Cache总量达到一定阈值之后就会启动淘汰机制,最近最少使用的B lo ck会被置换出来。在具体的实现细节方面,需要关注几占,/缓存分层策略H B a se 在L R U 缓 存 基础上,采用了缓存分层设计,将整个BlockCache 分 为三个部分:single-access,mutil-access和 inMemory。需要特别注意的是,H B a se 系 统 元 数 据 存 放 在 InMemory区,因 此 设 置 数 据 属 性 InMemory=t r u e 需要非常谨慎,确保此列族数据量
20、很小且访问频繁,否则有可能会将hbase.m eta元数据挤出内存,严重影响所有业务性能。L R U 淘汰算法实现系 统 在 每 次 cache b lo c k 时 将 B lo ckK ey和B lo c k 放入H ashM ap后 都 会 检 查 BlockC ache总量是否达到阈值,如果 达 到 阈 值,就 会 唤 醒 淘 汰 线 程 对 M a p 中 的 B lo c k 进行淘汰。系 统 设 置 三 个 M inM axPriorityQ ueue队 列,分别对应上述三 个 分 层,每个队列中的元素按照最近最少被使用排列,系统 会 优 先 p o ll出最近最少使用的元素,将
21、其对应的内存释放。可 见,三 个 分 层 中 的 B lo c k 会 分 别 执 行 L R U 淘汰算法进行淘汰。8.聊聊 sparkstreaming 和 flink?flink 流批一体解释一下?F lin k是标准的实时处理引擎,基于事件驱动。而SparkStreaming 是 微 批(Micro-Batch)的模型。下面就分几个方面介绍两个框架的主要区别:.架 构 模 型:Spark Stream ing在运行时的主要角色包括:Master.Worker.Driver.Executor;Flink 在运行时主要包:Jobmanager、Taskmanager 和 Sloto.任 务
22、 调 度:Spark Stream ing连续不断的生成微小的数 据 批 次,构 建 有 向 无 环 图DAG,Spark Stream ing会依次创 DStreamGraph.JobGenerator.JobScheduler;F lin k根据用户提交的代码生成StreamGraph,经过优化 生 成JobGraph,然 后 提 交 给JobM anager进 行 处 理,JobManager 会根据 JobGraph 生成ExecutionGraph,ExecutionGraph 是 Flink 调度最核心的数据结构,JobM anager根 据ExecutionGraph对Jo b进
23、行调度。.时 间 机 制:Spark Stream ing支持的时间机制有限,只支持处理时间。F lin k支持了流处理程序在时间上的三个 定 义:处理时间、事件时间、注入时间。同时也支持watermark机 制 来 处 理 滞 后 数 据。.容 错 机 制:对 于Spark Stream ing任 务,我们可以设置checkpoint,然后假如发生故障并重启,我们可以从上 次checkpoint之 处 恢 复,但是这个行为只能使得数据 不 丢 失,可能 会 重复处理,不能做到恰好一次处理语义。F lin k则使用两阶段提交协议来解决这个问题。F lin k的两阶段提交协议具体可以看这篇文章:
24、八张图搞懂F lin k端到端精准一次处理语义Exactly-once9.spark的几种shuffle说下?为什么要丢弃hashshuffle?前段时间刚写的,可 以 看 下:Sp ark的 两 种 核 心Shuffle详解10.java g c 可达性分析+垃圾回收器+垃圾回收算法+为什么分代垃圾回收+调优JV M相关的面试题可看这篇文章,文中第四、五题和本问题相 关:精 选 大 数 据 面 试 真题JV M专项1 1.数据库引擎,innodb索引实现+聚集和非聚集区别+为什么用b+树不用hashinnodb索弓I实 现:innoDB使用的是聚集索引,将主键组织到一棵B+树 中,而行数据就
25、储存在叶子节点上,若使用where id=14这样的条件查找主键,则 按 照B+树的检索算法即可查找到对应的叶节 点,之后获得行数据。若 对Name列进行条件搜索,则需要 两 个 步 骤:第一步在辅助索引B+树 中 检 索 Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树中再执行一次B+树检 索 操 作,最终到达叶子节点即可获取整行数据。聚集索引和非聚集索引的区别:.聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续。.聚集索引:物理存储按照索引排序;聚集索引是一种索引组 织 形 式,索引
26、的键值逻辑顺序决定了表数据行的物理存储顺序。.非聚集索引:物理存储不按照索引排序;非聚集索引则就是普通索引了,仅仅只是对数据列创建相应的索引,不影响整个表的物理存储顺序。索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。数据库索引使用B+树原因:InnoDB采 用 B+树 结 构,是 因 为 B+树能够很好地配合磁盘的读写特性,减少单次查询的磁盘访问次数,降 低 10、提升性能等。数据库索引不适合用hash的 原 因:.区间值难找。因为单个值计算会很快,而找区间值,比如100 id 2
27、0 0 就 悲 催 了,需要遍历全部hash节点。.排序难。通 过 hash算 法,也就是压缩算法,可能会很大的值和很小的值落在同一个hash桶 里,比如一万个数压 缩 成 1000个 数 存 到 hash桶 里,也就是会产生hash冲突。.不支持利用索引完成排序、以 及 like x x x%这样的部分模糊查询。.不支持联合索引的最左前缀匹配规则。12.聊 聊tcp和udp的区别简 单 说 下:.TCP面 向 连 接(如打电话要先拨号建立连接);UDP是 无 连 接 的,即发送数据之前不需要建立连接。.TCP提供可靠的服务。也 就 是 说,通 过 TCP连接传送的数 据,无 差 错,不 丢
28、失,不 重 复,且 按 序 到 达;UDP尽最大 努 力 交 付,即不保证可靠交付。Tcp通 过 校 验 和,重 传 控 制,序 号 标 识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。.UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。.每 一 条 TCP连接只能是点到点的;UDP支持一对一,一 对 多,多对一和多对多的交互通信。.TCP对系统资源要求较多;UDP对系统资源要求较少。13.http知道吗?说一下超文本传输协议(缩 写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是
29、万维网的数据通信的基础。HTTP协议定义W eb客户端如何从W eb服务器请求W eb页面,以及服务器如何把W eb页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。以 下 是 H T T P 请求/响应的步骤:.客户端连接到W eb服 务 器:一 个 H TTP客 户 端,通常是浏览器,与 W eb服 务 器 的 HTTP端 口(默 认 为 80)建立一个TC P 套接字连接。例 如,http:
30、/o.发 送 H TTP请 求:通 过 TC P套 接 字,客 户 端 向 W eb服务器发送一个文本的请求 报 文,一个请求报文由请求行、请求头部、空行和请求数据 4 部分组成。.服务器接受请求并返回H TTP响 应:W eb服务器解析请求,定位请求资源。服务器将资源复本写到 TC P 套 接 字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4 部分组成。.释放连接TC P连 接:若 co nnectio n模 式 为 clo se厕服务器主动关闭TCP连 接,客户端被动关闭连接,释 放 TC P连接;若co nnectio n模式为keepalive,则该连接会保持一段时间,在
31、该时间内可以继续接收请求;客户端浏览器解析H TM L内 容:客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节 的 HTM L文档和文档的字符集。客户端浏览器读取响应数据 HTML,根 据 HTM L的语法对其进行格式化,并在浏览器窗口中显小。14.http版本之间的比较这道题字节经常问,需 要 记 住:http0.9:最 初 的 h ttp 版 本,仅 支 持 g e t方 法,只能传输纯文本内容,所以请求结束服务段会给客户端返回一个HTM L格式的字符串,然后由浏览器自己渲染。http0.9是典型的无状态连接(无状态是指协议对于事务
32、处理没有记忆功能,对 同 一 个 u rl请求没有上下文关系,每次的请求都是独立的,服务器中没有保存客户端的状态)httpl.O:这个版本后任何文件形式都可以被传输,本质上支持长连接,但是默认还是短连接,增加了 keep-alive关键字来由短链接变成长连接。H TTP的请求和回应格式也发生了变化,除了要传输的数据之外,每次通信都包含头信息,用来描述一些信息。还增加了状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编召马(content encoding)等。httpl.l:HTTP1.1
33、最大的变化就是引入了长链接,也 就 是 TC P链接默认是不关闭的可以被多个请求复用。客户端或者服务器如果长时间发现对方没有活动就会关闭链接,但是规范的做法是客户端在最后一个请求的时候要求服务器关闭链接。对于同一 个 域 名,目前浏览器支持建立6 个长链接。节 约 带 宽,HTTP1.1支 持只发送header头信息不带任何body信 息,如果服务器认为客户端有权限请求指定数据那就返 回 100,没有就返回401,当客户端收到10 0 的时候可以才把要请求的信息发给服务器。并 且 L 1 还支持了请求部分内 容,如果当前客户端已经有一部分资源了,只需要向服务器请求另外的部分资源即可,这也是支持
34、文件断点续传的基础。1.1 版本中增加了 ho st处 理,在 H TTP1.0中认为每台服务器都绑定一个唯一的ip 地 址,因此在URL中并没有传递主机名,但是随着虚拟机技术的发展,可能在一台物理机器上存在多个 虚 拟 主 机,并且他们共享了一个ip地 址,h ttp l.l中请求消息和响应消息都支持host头 域,如果不存在还会报出错误。http2.0:多 路 复 用:在一个连接里面并发处理请求,不 像h ttp l.l在一 个tcp连接中各个请求是串行的,花销很大。在1.0版本后增加了 header头 信 息,2.0版本通过算法把header进行了压缩这样数据体积就更小,在网络上传输就更
35、快。服务端有了推送功能,将客户端感兴趣的东西推给客户端,当客户端请求这些时,直接去缓存中取就行。15.让你设计一个hash表,怎么设计?可以把java的hashmap的实现原理说下,因为这就是hash表的经典设计!内 容 较 多,并且网上资料很多,可以自己搜索 查 看!16.时间不多了,手橹一个二分查找二分查找图解:1 2 5 8 10 25 35 6410left mid right10M,句左遇勇,mid然 值 查 找 范 国减半find Vai1 2 5 8 10 25 35 64二分查找重提:数运有手二分查找的思於1先我到丰闾值2.然后官中叵值如查我值比衩2 1 相 等,找出2.2 中
36、间值 查 找 良 司左芝不逼闫查找2.3 中医值 查 发 宜 W右之行送百查我纪果存在值,复速学对应的下片,否贝嫌回-1left mid right10right)/递归退出条件,找不到,返同-1-1)val midIndex=(left+right)/2if(findVal arr(mid工 ndex)/向右速U /f找binarySearch(arr,mid工 ndex,rightA findVal)else/查找到,返回下标midlndex)拓 展 需 求:当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到。/*1,8,10,89,1000,1000,1234)当一个有序数组
37、中,有多个相同的数值时,如何将所有的数值都查找到,比如这里的1000./分析1.返回的结果是一个可变数组ArrayBuffer2.在找到结果时,向左边扫描,向右边扫描条件3.找到结果后,就加入到ArrayBuffer*/def binarySearch2(arr:ArrayInt,1:Int,r:工 nt,findVal:Int):ArrayBufferInt=/找不到条件?if(1 r)return ArrayBuffer()val midIndex=(1+r)/2val midVai=arr(midIndex)if(midVal findVal)/向左进行递归查找binarySearch2
38、(arrz 1,midIndex-1,findVal)else if(midVai findVal)/向彳i 进行递入查找binarySearch2(arr,midIndex+1,r,findVal)else printin(mid工 ndex=+midIndex)/定义一个可变数组val resArr=ArrayBufferInt()/向左边扫描var temp=midlndex-1breakable while(true)if(temp arr.length-1|arr(temp)!=findVal)break()if(arr(temp)=findVal)resArr.append(temp)temp+=1return resArr)