保研面试怎么准备备Android面试

Android面试题(入职唯品会之前一系列面试经验)
Android面试题(入职唯品会之前一系列面试经验)
疯狂的电脑
先来一张程序员鼓励师的美图镇楼今年的就业形势不好,原来的创业公司倒闭了,不得不开始重新找工作,也面试了大大小小不不少公司,也收到了好几个offer,感觉找工作不易,且行且珍惜吧,把面试中遇到的一些面试题整理如下:请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系?ps:相信这一题应该难不倒你们,这属于最基础的题了简单的说,Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理.Message: Handler接收和处理的消息对象Looper:每个线程只能拥有一个Looper。它的loop方法负责读取MessageQueue中的消息,之后把消息交给发送该消息的Handler处理MessageQueue:消息队列,使用先进先出的方式来管理Message。程序创建Looper对象时会在它的构造器中创建MessageQueue对象。下面是Looper的构造函数:Handler,它的作用有两个——发送消息和处理消息。程序使用Handler发送消息,被Handler发送的消息必须被送到指定的MessageQueue。也就是说,如果希望Handler正常工作,必须在当前线程中有一个MessageQueue,否则消息就没地方保存了。而MessageQueue是由Looper管理的,因此必须在当前线程中有一个Looper对象handler 导致的内存泄漏导致原因:当activity finish之后还有message没有处理就会导致内存泄漏如何处理:最好的做法是,使用静态内部类,然后在该类里使用弱引用来指向所在的Activity。view的绘制流程?ps:基本上每个公司都会问Measure 过程:measure() - onMeasure() - setMeasuredDimension()MeasureSpec 前2位是模式,后30位是数值,在自定义 视图时,不需要关心系统复杂的Measure过程,只需要在onMeasure调用setMeasuredDimension()设置根据MeasureSpec计算得到的尺寸即可Layout 过程:在Layout过程中,子视图会调用getMeasuredWidth()和getMeasuredHeight()方法获取到measure过程得到mMeasuredWidth和mMeasuredHeight,作为自己的width和height。然后调用每一个子视图的layout(),来确定每个子视图在父视图中的位置。Draw 过程:在自定义视图中, 也不应该复写该方法, 而是复写onDraw()方法进行绘制, 如果自定义的视图确实要复写该方法,先调用super.draw()完成系统的绘制,再进行自定义的绘制。dispatchDraw()发起对子视图的绘制,在View中默认为空实现,ViewGroup复写了dispatchDraw()来对其子视图进行绘制。自定义的ViewGroup不应该对dispatchDraw()进行复写。如何对自定义View进行控制1. 如果想控制View在屏幕上的渲染效果,就在重写onDraw()方法,在里面进行相应的处理。2. 如果想要控制用户同View之间的交互操作,则在onTouchEvent()方法中对手势进行控制处理。3. 如果想要控制View中内容在屏幕上显示的尺寸大小,就重写onMeasure()方法中进行处理。invalidate 会重新执行ondraw方法requestLayout会重新执行measure layout draw方法什么是软引用,弱引用,虚引用?有什么区别?ps:也是属于基础题软引用是内存不足的时候就回收,弱引用是gc线程扫描到就回收,虚引用是不决定对象的生命周期。android有几种进程?如何提高service的生存率?1.前台进程 2.服务进程 3.后台进程 4.可见进程 5.空进程startforegound变成前台进程在onStartCommand中return sart_stickyBinder机制?ps:这个属于稍微有点难度的题目了 记得在面试众安的时候就是这道题目答对了 然后就发了offer首先Binder是android进程间通信的一种方式,基本原理:binder定义了4个角色:client,server,serviceManager ,binder驱动server会创建一个binder实体并起一个名字,然后将名字一块以数据包的形式通过binder驱动发送给serviceManager ,通知servicemanager注册一个名字为xx的Binder,然后client通过名字查询到该Binder 的引用。注意:1,Client和Server和ServiceManager实现在用户空间,Binder驱动实现在内核空间中2,Binder驱动程序和ServiceManager在Android中已经实现,开发者只需要实现Client和Server3,ServiceMagager是一个守护进程,用来管理Server,并向Client提供查询Server接口的能力4,Client和Server之间通信,是通过Binder驱动程序间接实现找一个aidl例子看一看glide源码分析ps:有些公司就喜欢问一些这种问题,问你有没有看过源码,考察你有没有主动学习的能力和态度采用流式编码方式,方便开发真使用。RequestManager这个类主要用于管理和启动Glide的所有请求。RequestBuilder处理设置选项,并启动负载的通用资源类型。Retrofit2源码分析?ps:同上一个基于okhttp的Restful api请求工具,retrofit充当了一个适配器的角色,将一个java接口翻译成一个http请求,然后用okhttp发送这个请求。使用了动态代理:ZhuanLanApi api = retrofit.create(ZhuanLanApi.class);Call&ZhuanLanAuthor& call = api.getAuthor(&qinchao&);其实api是一个动态代理对象,当调用getAuthor时会调用Proxy.newProxyInstance方法中的InvocationHandler对象,然后通过反射获取getAuthor方法的注解信息,配合args参数,创建一个ServiceMethod对象,ServiceMethod就像一个中央处理器,它会生成一个Request,最后使用okhttp3作为底层发送请求。Retrofit非常巧妙的用注解来描述一个HTTP请求,将一个HTTP请求抽象成一个Java接口,然后用了Java动态代理的方式,动态的将这个接口的注解“翻译”成一个HTTP请求,最后再执行这个HTTP请求ArrayList、LinkedList、Vector的底层实现和区别ps:这个属于java基础题目Vector:线程安全 使用数组存储 数组长度不够增长一倍ArrayList:线程不安全 使用数组存储 数组长度不够增长50% 插入删除比较慢,查询比较快LinkedList:线程不安全 使用链表存储,插入删除比较快,查询比减慢HashMap和HashTable的底层实现和区别,两者和ConcurrentHashMap的区别。ps:工作中这些原理不太容易注意到,时间长不复习复习还真容易忘了HashMap:线程不安全HashTable:线程安全实现原理:首先是哈希数组 数组的每个元素都是一个单链表的头节点,链表是用来解决冲突的,如果不同的key映射到数组的同一个位置就将其放在单链表中。默认容量是16,默认加载因子是0.75,容量是2的n次方加载因子越大,对空间使用的越充分,但是查找效率就会降低(链表就会越长)hashmap的散列算法是h&(length-1) 是hashcode和len-1的与运算,相当于对length取模运算,扩容为什么是2的整数次方是因为2的整数次方肯定是偶数,len-1就是奇数,奇数的最后一位是1 那么在与运算的时候就最后一位就有可能是0也有可能是1 即结果有可能是偶数也有可能是奇数,不会浪费一半的空间。图片加载三级缓存答案:网络,内存,本地lru缓存淘汰算法:链表结构,删除和插入都比较快,最新使用的移到头部,新加载的插入在头部,同时删除尾部安卓性能优化有哪些方法?ps:这个也是送分题,多说一点,说的越多面试效果越好1.节制的使用service:当启动一个service后,系统会倾向于将这个Service所依赖的进程进行保留,系统可以在LRUcache当中缓存的进程数量也会减少,导致切换程序的时候耗费更多性能,建议使用inutentService,可以自动停止2.当界面不可见的时候释放资源:重写Activity的onTrimMemory 监听TRIM_MEMORY_UI_HIDDEN级别进行内存和资源释放3.当内存紧张时释放资源 onTrimMemory 根据不同级别来释放内存4.避免在bitmap上浪费内存:不去加载不需要的分辨率,可对图片进行压缩 可以质量压缩也可以边界压缩5.知晓内存的开销情况:使用枚举通常会比使用静态常量消耗两倍以上的内存,尽可能不使用枚举6.尽量避免使用依赖注入框架:使用依赖注入框架貌似看上去把findViewById()这一类的繁琐操作去掉了,但是这些框架为了要搜寻代码中的注解,通常都需要经历较长的初始化过程,并且将一些你用不到的对象也一并加载到内存中。这些用不到的对象会一直站用着内存空间,可能很久之后才会得到释放,所以可能多敲几行代码是更好的选择。7.谨慎使用抽象编程:在Android使用抽象编程会带来额外的内存开支,因为抽象的编程方法需要编写额外的代码,虽然这些代码根本执行不到,但是也要映射到内存中,8.使用多进程:这个技巧比较适用于哪些需要在后台去完成一项独立的任务,和前台是完全可以区分开的场景,比如音乐播放就非常适合两个进程9.使用StringBuilder代替使用+号拼接字符串10.使用增强型for循环语法:避免如下写法,因为每次都要计算长度public void zero() {
int sum = 0;
for (int i = 0; i & mArray. ++i) {
sum += mArray[i].mC
} }11.布局优化:重用布局文件,使用ViewStub垃圾回收机制?ps:java经典面试题引用计数法:缺点是无法处理循环引用问题标记-清除法:标记所有从根结点开始的可达对象,缺点是会造成内存空间不连续,不连续的内存空间的工作效率低于连续的内存空间,不容易分配内存复制算法:将内存空间分成两块,每次将正在使用的内存中存活对象复制到未使用的内存块中,之后清除正在使用的内存块。算法效率高,但是代价是系统内存折半。适用于新生代(存活对象少,垃圾对象多)标记-压缩算法:标记-清除的改进,清除未标记的对象时还将所有的存活对象压缩到内存的一端,之后,清理边界所有空间既避免碎片产生,又不需要两块同样大小的内存快,性价比高。适用于老年代。分代 根据生命周期去分代 用不同的频率去扫描什么是Neo4j?ps:这个了解就好,一般不会问这种问题所用语言: Java特点:基于关系的图形数据库使用许可: GPL,其中一些特性使用 AGPL/商业许可协议: HTTP/REST(或嵌入在 Java中)可独立使用或嵌入到 Java应用程序图形的节点和边都可以带有元数据很好的自带web管理功能使用多种算法支持路径搜索使用键值和关系进行索引为读操作进行优化支持事务(用 Java api)使用 Gremlin图形遍历语言支持 Groovy脚本支持在线备份,高级监控及高可靠性支持使用 AGPL/商业许可最佳应用场景:适用于图形一类数据。这是 Neo4j与其他nosql数据库的最显著区别例如:社会关系,公共交通网络,地图及网络拓谱代码混淆有哪些需要注意的地方?答案:不能混淆的地方你引用的第三方库不能混淆系统的api,如一些activity的生命周期方法不能混淆在androidmainfest里面的activity不能混淆你需要暴露的接口不能混淆sdk开发有什么心得?ps:记得面试阿里的时候问到的,自己答得也不好1. 将整个项目合理的拆分为许多模块,各个模块功能职责明确,降低各个模块的依赖,耦合;做到想用某一个模块时就用,不用时就去除掉,并且不影响其他模块2. 合理设计类与类之间的继承关系,接口的实现关系,和利用java的public、private、protected、default权限,来掩藏代码内部逻辑,争取做到只暴露外部开发接口,完全掩藏内部逻辑3.jni操作,内部算法类,数据加解密已一些数据操作的类,尽量都写在jni内,这样代码的安全性会大大增加4.代码混淆,主要是在proguard-android文件下编写混淆代码,当你打开混淆时,默认是所有代码均进行混淆,你编写的代码就是保持哪些类不被混淆,一般来说下面几个你不能混淆,不能混淆的地方udt协议1.基于udp的数据传输协议2.UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差3.它同时支持可靠的数据流传输和部分可靠的数据报传输。包结构UDT有两种包:数据包和控制包。他们通过包头的第一位来区分(标志位)。假如是0,表示是数据包,1表示是控制包。事件分发机制?ps:android必问题1,如果我们没有对控件里面的方法进行重写或更改返回值,而直接用super调用父类的默认实现那么整个事件流向应该是从Activity----&ViewGroup---&View 从上往下调用dispatchTouchEvent方法,一直到叶子节点(View)的时候,再由View---&ViewGroup---&Activity从下往上调用onTouchEvent方法。2,dispatchTouchEvent 和 onTouchEvent 一旦return true,事件就停止传递了(到达终点)3,dispatchTouchEvent 和 onTouchEvent return false的时候事件都回传给父控件的onTouchEvent处理。4,onInterceptTouchEvent 的作用,Intercept 的意思就拦截,每个ViewGroup每次在做分发的时候,问一问拦截器要不要拦截(也就是问问自己这个事件要不要自己来处理)如果要自己处理那就在onInterceptTouchEvent方法中 return true就会交给自己的onTouchEvent的处理,如果不拦截就是继续往子控件往下传。默认是不会去拦截的,因为子View也需要这个事件,所以onInterceptTouchEvent拦截器return super.onInterceptTouchEvent()和return false是一样的,是不会拦截的,事件会继续往子View的dispatchTouchEvent传递。ART和Dalvik区别?Art上应用启动快,运行快,但是耗费更多存储空间,安装时间长,总的来说ART的功效就是&空间换时间&。ART: Ahead of Time Dalvik: Just in Time什么是ART:Android操作系统已经成熟,Google的Android团队开始将注意力转向一些底层组件,其中之一是负责应用程序运行的Dalvik运行时。Google开发者已经花了两年时间开发更快执行效率更高更省电的替代ART运行时。ART代表Android Runtime,其处理应用程序执行的方式完全不同于Dalvik,Dalvik是依靠一个Just-In-Time(JIT)编译器去解释字节码。开发者编译后的应用代码需要通过一个解释器在用户的设备上运行,这一机制并不高效,但让应用能更容易在不同硬件和架构上运行。ART则完全改变了这套做法,在应用安装的时候就预编译字节码到机器语言,这一机制叫Ahead-Of-Time(AOT)编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。ART优点:系统性能的显著提升应用启动更快、运行更快、体验更流畅、触感反馈更及时更长的电池续航能力支持更低的硬件ART缺点:更大的存储空间占用,可能会增加10%-20%更长的应用安装时间Android关于OOM的解决方案ps:属于必问题在内存中加载图片时直接在内存中作处理,如边界压缩 和质量压缩动态回收内存优化Dalvik虚拟机的堆内存分配自定义堆内存大小EventBus?事件(Event):又可称为消息,本文中统一用事件表示。其实就是一个对象,可以是网络请求返回的字符串,也可以是某个开关状态等等。事件类型(EventType)指事件所属的 Class。事件分为一般事件和 Sticky 事件,相对于一般事件,Sticky 事件不同之处在于,当事件发布后,再有订阅者开始订阅该类型事件,依然能收到该类型事件最近一个 Sticky 事件。订阅者(Subscriber):订阅某种事件类型的对象。当有发布者发布这类事件后,EventBus 会执行订阅者的 onEvent 函数,这个函数叫事件响应函数。订阅者通过 register 接口订阅某个事件类型,unregister 接口退订。订阅者存在优先级,优先级高的订阅者可以取消事件继续向优先级低的订阅者分发,默认所有订阅者优先级都为 0。发布者(Publisher):发布某事件的对象,通过 post 接口发布事件。RxJava?使用流式编程,代码更简洁其实, RxJava 的本质可以压缩为异步这一个词。说到根上,它就是一个实现异步操作的库,而别的定语都是基于这之上的。RxJava 的观察者模式RxJava 有四个基本概念:Observable (可观察者,即被观察者)、 Observer (观察者)、 subscribe (订阅)、事件。Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。与传统观察者模式不同, RxJava 的事件回调方法除了普通事件 onNext() (相当于 onClick() / onEvent())之外,还定义了两个特殊的事件:onCompleted() 和 onError()。onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的 onNext() 发出时,需要触发 onCompleted() 方法作为标志。onError(): 事件队列异常。在事件处理过程中出异常时,onError() 会被触发,同时队列自动终止,不允许再有事件发出。在一个正确运行的事件序列中, onCompleted() 和 onError() 有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted() 和 onError() 二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。死锁?ps:这个问题最好准备准备,考验基础知识当线程需要同时持有多个锁时,有可能产生死锁。考虑如下情形:线程A当前持有互斥所锁lock1,线程B当前持有互斥锁lock2。接下来,当线程A仍然持有lock1时,它试图获取lock2,因为线程B正持有lock2,因此线程A会阻塞等待线程B对lock2的释放。如果此时线程B在持有lock2的时候,也在试图获取lock1,因为线程A正持有lock1,因此线程B会阻塞等待A对lock1的释放。二者都在等待对方所持有锁的释放,而二者却又都没释放自己所持有的锁,这时二者便会一直阻塞下去。这种情形称为死锁。如何避免:只在必要的最短时间内持有锁,考虑使用同步语句块代替整个同步方法;尽量编写不在同一时刻需要持有多个锁的代码,如果不可避免,则确保线程持有第二个锁的时间尽量短暂;创建和使用一个大锁来代替若干小锁,并把这个锁用于互斥,而不是用作单个对象的对象级别锁;观察者模式?首先在Android中,我们往ListView添加数据后,都会调用Adapter的notifyDataChanged()方法,其中使用了观察者模式。当ListView的数据发生变化时,调用Adapter的notifyDataSetChanged函数,这个函数又会调用DataSetObservable的notifyChanged函数,这个函数会调用所有观察者(AdapterDataSetObserver)的onChanged方法,在onChanged函数中又会调用ListView重新布局的函数使得ListView刷新界面。单例模式?ps:单例模式要能熟练的写出3种以上,并能详细解释每一种优缺点,属于问烂的题目了这里写一个不同寻常的,利用jvm虚拟机加载内部类的原理代理模式?模式介绍代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。模式的使用场景就是一个人或者机构代表另一个人或者机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。角色介绍抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。目标对象角色:定义了代理对象所代表的目标对象。代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。优点与缺点优点给对象增加了本地化的扩展性,增加了存取操作控制缺点会产生多余的代理类builder模式?将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。相同的方法,不同的执行顺序,产生不同的事件结果时;多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适;Android源码中的模式实现在Android源码中,我们最常用到的Builder模式就是AlertDialog.Builder, 使用该Builder来构建复杂的AlertDialog对象良好的封装性, 使用建造者模式可以使客户端不必知道产品内部组成的细节;建造者独立,容易扩展;在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。会产生多余的Builder对象以及Director对象,消耗内存;对象的构建过程暴露。原型模式类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等,通过原型拷贝避免这些消耗;通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式;一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。Intent中使用了原型模式Uri uri = Uri.parse(&smsto:&);
Intent shareIntent = new Intent(Intent.ACTION_SENDTO, uri);
shareIntent.putExtra(&sms_body&, &The SMS text&);
Intent intent = (Intent)shareIntent.clone() ; startActivity(intent);原型模式是在内存二进制流的拷贝,要比直接 new 一个对象性能好很多,特别是要在一个循环体内产生大量的对象时,原型模式可以更好地体现其优点。这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的,在实际开发当中应该注意这个潜在的问题。优点就是减少了约束,缺点也是减少了约束,需要大家在实际应用时考虑。策略模式?模式的定义策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。注:针对同一类型操作,将复杂多样的处理方式分别开来,有选择的实现各自特有的操作。针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。需要安全的封装多种同一类型的操作时。出现同一抽象多个子类,而又需要使用if-else 或者 switch-case来选择时。策略模式主要用来分离算法,根据相同的行为抽象来做不同的具体策略实现。android apk加固原理1、需要加密的Apk(源Apk)2、壳程序Apk(负责解密Apk工作)3、加密工具(将源Apk进行加密和壳Dex合并成新的Dex)我们拿到需要加密的Apk和自己的壳程序Apk,然后用加密算法对源Apk进行加密在将壳Apk进行合并得到新的Dex文件,最后替换壳程序中的dex文件即可,得到新的Apk,那么这个新的Apk我们也叫作脱壳程序Apk.他已经不是一个完整意义上的Apk程序了,他的主要工作是:负责解密源Apk.然后加载Apk,让其正常运行起来。synchronized和volatile的区别一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。2)禁止进行指令重排序。volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。1.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的2.volatile仅能实现变量的修改可见性,并不能保证原子性;synchronized则可以保证变量的修改可见性和原子性3.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。4.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化热修复原理ps:这属于加分题qq空间超级补丁:把BUG方法修复以后,放到一个单独的DEX里,插入到dexElements数组的最前面,让虚拟机去加载修复完后的方法。当patch.dex中包含Test.class时就会优先加载,在后续的DEX中遇到Test.class的话就会直接返回而不去加载,这样就达到了修复的目的。缺点:需要重新启动appandFix:提供了一种运行时在Native修改Filed指针的方式,实现方法的替换,达到即时生效无需重启,对应用无性能消耗的目的。tcp三次握手和四次挥手:三次握手:四次挥手:android开发如何解耦?ps:这题是面试携程的时候问到的1.app模块插件化,每一个功能模块都类似于一个项目可以独立开发、运行、测试。这些模块UI跳转之间的耦合可以使用URL来进行跳转。2.项目本身使用更加合理的框架,例如MVP,mvvm,不能生搬硬套,根据项目情况合理使用。3.使用EventBus,实现组件之间的解耦。4.使用单一职责的模式设计activity,activity只负责显示ui和跟用户交互,像网络请求,界面刷新操作交给presenter去处理5.使用mvvm模式可以解耦xml界面6.使用组件化开发7.使用插件化开发 DroidPluginwebview加载慢怎么解决?1、提高渲染的优先级// webSettings.setRenderPriority(RenderPriority.HIGH);2、把图片加载放在最后来加载渲染webSettings.setBlockNetworkImage(true);3,使用硬件加速,该功能在Android 3.0 (API level 11)才加入。4、开启缓存// 开启H5(APPCache)缓存功能webSettings.setAppCacheEnabled(true);插件化开发原理模块与模块之间如何解耦mvvm模式:viewmodel databinding library怎么判断一个链表是否有环?ps:经典算法题方法一:使用p、q两个指针,p总是向前走,但q每次都从头开始走,对于每个节点,看p走的步数是否和q一样。如图,当p从6走到3时,用了6步,此时若q从head出发,则只需两步就到3,因而步数不等,出现矛盾,存在环方法二:使用p、q两个指针,p每次向前走一步,q每次向前走两步,若在某个时候p == q,则存在环。hashmap查找一个元素的时间复杂度?ps:面试爱奇艺的时候问到了最好的情况O(1) 最怀情况O(n)总结:如果你要是面试阿里的p6 p7的职位我觉得上面的题目必须都会而且要求对答如流,除此之外要对android组件化开发有自己的理解,对android系统架构要比较熟悉,还有就是随机应变的能力了,对于阿里的面试我感觉是要求最高的,他们会问的特别细,对于技术要完全掌握,一知半解的话面试官一眼就看出来了。最后祝愿大家面试顺利。
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
疯狂的电脑
百家号 最近更新:
简介: 你的生活是科学技术的细致服务。
作者最新文章}

我要回帖

更多关于 国企面试怎么准备 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信