2019年程序员考试面试题精选题
程序员面试题精选100题

程序员面试题精选100题1. 什么是面向对象编程(OOP)?列举几种常见的面向对象编程语言。
2. 解释一下封装、继承和多态的概念。
3. 什么是数据结构?列举几种常见的数据结构。
4. 解释一下栈和队列的概念,并提供它们的实际应用场景。
5. 什么是算法?解释一下时间复杂度和空间复杂度的概念。
6. 解释一下HTTP协议的工作原理。
7. 什么是数据库事务?解释一下ACID原则。
8. 解释一下前端开发中的MVC和MVVM模式。
9. 解释一下正向代理和反向代理的区别。
10. 什么是RESTful API?列举一些常见的HTTP请求方法。
11. 解释一下同步和异步的概念,以及它们的区别。
12. 解释一下进程和线程的概念,并提供它们的区别。
13. 解释一下操作系统中的死锁问题,以及如何避免死锁。
14. 解释一下TCP/IP协议族的组成部分。
15. 什么是单元测试?解释一下TDD(测试驱动开发)的概念。
16. 解释一下版本控制系统中的分布式版本控制和集中式版本控制的区别。
17. 什么是软件设计模式?列举几种常见的软件设计模式。
18. 解释一下Web应用程序中的会话管理机制,以及如何处理会话跟踪。
19. 解释一下缓存的工作原理,并提供一些常见的缓存算法。
20. 什么是虚拟机?解释一下虚拟化技术的概念。
21. 解释一下操作系统中的文件系统,以及不同类型的文件系统。
22. 解释一下数据库索引的概念,以及为什么使用索引可以提高查询性能。
23. 什么是反射?解释一下反射在Java中的应用。
24. 解释一下关系型数据库和非关系型数据库的区别。
25. 什么是分布式系统?列举一些常见的分布式系统架构。
26. 解释一下HTTP和HTTPS的区别,以及为什么使用HTTPS更安全。
27. 解释一下云计算的概念,以及云计算的优势和劣势。
28. 什么是容器化?解释一下Docker的工作原理。
29. 解释一下RESTful风格的API设计原则。
java2019面试题目100及最佳答案

java2019面试题目100及最佳答案1. 什么是Java平台?请列举Java平台的三个主要组成部分。
答案:Java平台是指Java语言的运行环境,它包括Java虚拟机(JVM)、Java核心类库和Java编程语言本身。
三个主要组成部分包括Java运行时环境(JRE)、Java开发工具包(JDK)和Java应用程序接口(API)。
2. 解释Java中的异常处理机制。
答案:Java中的异常处理机制允许程序在运行时捕获和处理错误。
它使用try、catch和finally关键字来实现。
try块中包含可能抛出异常的代码,catch块用于捕获和处理异常,finally块中的代码无论是否发生异常都会执行。
3. Java中什么是多线程?请说明其优缺点。
答案:Java中的多线程是指在同一个进程中并行执行两个或多个线程的能力。
优点包括提高程序的响应性和效率,以及能够充分利用多核处理器。
缺点包括增加了程序的复杂性,可能导致资源竞争和死锁。
4. 解释Java中的垃圾回收机制。
答案:Java中的垃圾回收机制是指自动回收不再被引用的对象所占用的内存。
Java虚拟机(JVM)负责周期性地执行垃圾回收,以避免内存泄漏。
5. Java中的集合框架有哪些主要接口?答案:Java中的集合框架主要包括以下接口:List、Set、Map、Queue和Deque。
这些接口定义了集合的基本操作,如添加、删除、遍历等。
6. 什么是Java泛型?请举例说明其用途。
答案:Java泛型是指在定义类、接口、方法时使用类型参数,以支持编译时类型检查。
泛型可以提高代码的复用性和安全性。
例如,定义一个泛型类`List<T>`,其中T可以是任何类型的对象。
7. Java中什么是注解(Annotation)?请列举其主要用途。
答案:Java中的注解是一种特殊的接口,用于为代码提供元数据。
主要用途包括编译时处理、类和方法的标记、运行时处理等。
8. 解释Java反射机制及其应用场景。
2018-2019-程序员面试的问题-实用word文档 (4页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==程序员面试的问题1.Are you the principal applicant?2.What is your marital status? When did you get married?3.Do you remember the date of your marriage?4.What is your current mailing address?5.Do you have any children?6.Do you have a passport?7.When did you graduate from the university?8.What is the major of your university degree?9.What are the major courses of your university major?10.When did you start working?11.What is your current occupation?12.When did you become an assistant engineer?13.When did you become an engineer? 14.What do you do at your current position?15.When did you change your job to the current position?16.Do you have an immigration agent?17.Which city in Canada do you intent to move in 18.How much money do you earn each month? 19.How much money do you have to bring over to Canada?20.Why did you choose Toronto as your immigration destination?21.How many workers in your work unit?22.How many employees are there in your group? 23.How many engineers and clerks are there in your group?24.Could you explain your first job on a daily basis?25.What are the names of projects that you had finished in the past few years?26.Could you explain your academic research at the institute?27. Why did you want to immigrant to Canada instead of other countries, such as USA, or Australia?28.How are you going to find a job in Canada?29.IF you could not find a job in the first years, what are you going to do ?30.Have you done anything for your preparation of immigration to Canada?31.Do you know anything about the Canadian labor market?32.Do you have any friend in Canada?33.How much money do you have that is transferable to Canada?34.Do you know anything about Toronto?35.Please explain in details of how you do research on N.C system?36.What kind of computer language do you know?37.What kind of automatic control system do you research?38.What is your wife’s occupation? 39Do you have any relativesin Canada?39.What is the name of your friend in Canada (if you have)?40.Are you going to study in Canada?41.Could you write down what are you going to do tomorrow in English?。
2019最全前端面试问题及答案总结

2019最全前端⾯试问题及答案总结HTML&CSS:对Web标准的理解、浏览器内核差异、兼容性、hack、CSS基本功:布局、盒⼦模型、选择器优先级及使⽤、HTML5、CSS3、移动端适应。
JavaScript:数据类型、⾯向对象、继承、闭包、插件、作⽤域、跨域、原型链、模块化、⾃定义事件、内存泄漏、事件机制、异步装载回调、模板引擎、Nodejs、JSON、ajax等。
其他: HTTP、安全、正则、优化、重构、响应式、移动端、团队协作、可维护、SEO、UED、架构、职业⽣涯1.请你谈谈Cookie的弊端cookie1.IE6或更低版本最多20个cookie2.IE7和之后的版本最后可以有50个cookie。
3.Firefox最多50个cookie4.chrome和Safari没有做硬性限制Opera 会清理近期最少使⽤的Firefox会随机清理 4096字节,为了兼容性,⼀般不能超过 IE 提供了⼀种存储可以持久化⽤户数据,叫做IE5.0就开始⽀持。
每个数据最多128K,每个域名下最多1M。
这个持久化数据放在缓存中,如果缓存没有清理,那么会⼀直存在。
优点:极⾼的扩展性和可⽤性1.通过良好的编程,控制保存在cookie中的session对象的⼤⼩。
2.通过加密和安全传输技术(SSL),减少cookie被破解的可能性。
3.只在cookie中存放不敏感数据,即使被盗也不会有重⼤损失。
4.控制cookie的⽣命期,使之不会永远有效。
偷盗者很可能拿到⼀个过期的cookie。
缺点:1.`Cookie`数量和长度的限制。
每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉。
2.安全性问题。
如果cookie被⼈拦截了,那⼈就可以取得所有的session信息。
即使加密也与事⽆补,因为拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到⽬的了。
2019前端面试题总结及答案

2019前端⾯试题总结及答案⼀)vue router 跳转⽅式1.this.$router.push()跳转到不同的url,但这个⽅法会向history栈添加⼀个记录,点击后退会返回到上⼀个页⾯。
1. this.$router.push({path: '/home/sort/detail',query:{id: 'abc'}})获取参数 {{this.$erId}}2. this.$router.push({name: 'detail',params:{id: 'abc'}})获取参数:{{this.$erId}}ps:query和params 的区别:1.⽤法上query要⽤path来引⼊,params要⽤name来引⼊:egthis.$router.push({name:"detail",params:{name:'nameValue',code:10011}});2.展⽰上的 query更加类似于我们ajax中get传参,params则类似于post,说的再简单⼀点,前者在浏览器地址栏中显⽰参数,后者则不显⽰2.this.$router.replace()同样是跳转到指定的url,但是这个⽅法不会向history⾥⾯添加新的记录,点击返回,会跳转到上上⼀个页⾯。
上⼀个记录是不存在的。
3.this.$router.go(n)相对于当前页⾯向前或向后跳转多少个页⾯,类似window.history.go(n)。
n可为正数可为负数。
正数返回上⼀个页⾯4.声明式:1) 根据路由路径(/home/sort/detail)跳转 <router-link :to="{path: '/home/sort/detail', query:{id: 'abc'}}">点击查看⼦页⾯</router-link>2) 根据路由名称(detail)跳转 <router-link :to="{name: 'detail', params:{id: 'abc'}}">点击查看⼦页⾯</router-link> :to="" 可以实现绑定动态的路由和参数⼆)Cookie和localStorage、sessionStorage的区别名称cookie localStorage sessionStorage相同点都可以⽤来在浏览器端存储数据,都是字符串的键值对数据声明周期⼀般由服务器⽣成,可设置失效时间;若在浏览器⽣成,默认关闭浏览器之后失效除⾮被清除,否则永久有效仅对当前对话有效,关闭当前页⾯或者浏览器后被清除存储⼤⼩4kb⼀般5mb与服务端通信每次都会携带在http请求头中,如果使⽤cookie保存过多,性能不太好仅在客户端存储,不参与服务端通信⽤途⼀般由服务器⽣成,来标识⽤户⾝份勇于浏览器端缓存数据三)数组相关参考⽂章数组相关:四)let var const 的区别1:var全局变量,存在变量提升,在声明前取值为undefined 会挂载在window上如:var a = 1;console.log(a,window.a) // 1 12:let 声明局部变量,只在块级作⽤域内有效console.log(b); // 报错:b在初始化之前不能接收let b = 10;var a = [];for (var i = 0; i < 10; i++) {a[i] = function () {console.log(i);};}a[2](); //10var b = [];for (let k = 0; k < 10; k++) {b[k] = function () {console.log(k);};}b[2](); //23:const 声名的是常量,⼀经声明不可改变。
2019年腾讯最新Java工程师面试题

2019年腾讯最新Java⼯程师⾯试题⼀、单选题(共21题,每题5分)1在正则表达式当中下⾯那⼀个字符集表⽰⾮空格字符、[:graph:]、[:digit:]C、[:space:]D、[:alpha:]参考答案:A答案解析:A2下列叙述中,错误的是( )。
A、内部类可访问它所在类的成员B、内部类的名称与定义它的类的名称可以相同C、内部类可⽤abstract修饰D、内部类可作为其他类的成员参考答案:A答案解析:暂⽆3以下哪个排序算法中,元素的⽐较次数元素与元素的初始排列⽆关()A、希尔排序B、快速排序C、归并排序D、直接插⼊排序E、选择排序参考答案:E4下⾯程序的输出结果是什么。
下⾯程序的输出结果是什么。
```1public class A2{2public static void main(String[] args){3int[] a={2,4,6,8,3,6,9,12};4 doSomething(a,0,a.length-1);5for(int i=0;i=x){6 swap(a,i,j);7 i++;//交换了⼏次8 }9 }//把最⼤的放到最后10 swap(a,i,end);//把最⼤的放到i的位置11return i;12 }1314private static void swap(int[] a,int i,int j)15 {16int tmp=a[i];17 a[i]=a[j];18 a[j]=tmp;19 }20 }21 ```A、找到最⼤值B、找到最⼩值C、从⼤到⼩的排序D、从⼩到⼤的排序参考答案:C答案解析:开始被注释迷惑了半天。
按快排的思想,遍历数组将⽐x⼤的按顺序存⾄a\[0\]a\[1\]a\[2\]..此时j负责遍历数组,i负责依次指向下⼀次遍历判断得到的⼤于x的数该存储的位置,每⼀次成功存储向后移动⼀格swap(a,i,end);//把最⼤的放到i的位置应该是将x交换⾄分界点,( x并⾮最⼤)⾄此⼀趟core完成,x左侧⼤于x,x右侧⼩于x,x左右任是⽆序数列然后依据分治的思想,对左序列,右序列迭代。
【黑马程序员】Java试题、50道Java面试题集(2019最新版)

【黑马程序员】Java试题、50道Java面试题集(2019最新版)以下的内容是对原有的和最近Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,相对来说比较经典,相信对准备入职的Java程序员一定有所裨益。
一、Java基础部分1、面向对象的特征有哪些方面?答:面向对象的特征主要有以下几个方面:1)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。
抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
2)继承:继承是从已有类得到继承信息创建新类的过程。
提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。
继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java与模式》或《设计模式精解》中关于桥梁模式的部分)。
3)封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。
面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。
我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。
可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。
4)多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。
简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。
多态性分为编译时的多态性和运行时的多态性。
如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B 系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。
(完整版)2019最新Java面试题,常见面试题及答案汇总

ava 最新常见面试题+ 答案汇总1、面试题模块汇总面试题包括以下十九个模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC 、Spring Boot/Spring Cloud 、 Hibernate 、 Mybatis 、RabbitMQ 、 Kafka、Zookeeper、 MySql、Redis、 JVM 。
以以下图所示:可能对于初学者不需要后边的框架和JVM 模块的知识,读者朋友们可依照自己的情况,选择对应的模块进行阅读。
合适阅读人群需要面试的初 / 中 / 高级java 程序员想要查漏补缺的人想要不断完满和扩大自己java 技术栈的人java 面试官详细面试题下面一起来看208 道面试题,详细的内容。
一、 Java 基础1.JDK 和 JRE 有什么差异?2.== 和 equals 的差异是什么?3.两个对象的hashCode()相同,则equals() 也必然为true ,对吗?4.final 在 java 中有什么作用?5.java 中的 Math.round(-1.5)等于多少?6.String 属于基础的数据种类吗?7.java 中操作字符串都有哪些类?它们之间有什么差异?8.String str="i" 与 String str=new String( “ i”)相同吗?9.如何将字符串反转?10.String 类的常用方法都有那些?11.抽象类必定要有抽象方法吗?12.一般类和抽象类有哪些差异?13.抽象类能使用final修饰吗?14.接口和抽象类有什么差异?15.java 中 IO 流分为几种?、 NIO、 AIO 有什么差异?17.Files 的常用方法都有哪些?二、容器18.java 容器都有哪些?19.Collection 和 Collections 有什么差异?、 Set、 Map 之间的差异是什么?21.HashMap 和 Hashtable 有什么差异?22.如何决定使用HashMap 还是TreeMap?23.说一下HashMap 的实现原理?24.说一下HashSet 的实现原理?25.ArrayList 和 LinkedList 的差异是什么?26.如何实现数组和List 之间的变换?27.ArrayList 和 Vector 的差异是什么?28.Array 和 ArrayList 有何差异?29.在 Queue 中 poll() 和 remove() 有什么差异?30.哪些会集类是线程安全的?31.迭代器Iterator是什么?怎么使用?有什么特点?和ListIterator有什么差异?34.怎么保证一个会集不能够被更正?三、多线程35.并行和并发有什么差异?36.线程和进度的差异?37.保卫线程是什么?38.创办线程有哪几种方式?39.说一下runnable和callable有什么差异?40.线程有哪些状态?41.sleep() 和 wait() 有什么差异?42.notify() 和 notifyAll() 有什么差异?43.线程的run()和 start() 有什么差异?44.创办线程池有哪几种方式?45.线程池都有哪些状态?46.线程池中submit() 和 execute()方法有什么差异?47.在 java 程序中怎么保证多线程的运行安全?48.多线程锁的升级原理是什么?49.什么是死锁?50.怎么防范死锁?51.ThreadLocal 是什么?有哪些使用途景?52.说一下synchronized 基层实现原理?53.synchronized 和 volatile的差异是什么?54.synchronized 和 Lock 有什么差异?55.synchronized 和 ReentrantLock 差异是什么?56.说一下atomic 的原理?四、反射57.什么是反射?58.什么是java 序列化?什么情况下需要序列化?59.动向代理是什么?有哪些应用?60.怎么实现动向代理?五、对象拷贝61.为什么要使用克隆?62.如何实现对象克隆?63.深拷贝和浅拷贝差异是什么?六、 Java Web64.jsp 和 servlet有什么差异?65.jsp 有哪些内置对象?作用分别是什么?66.说一下jsp 的 4 种作用域?67.session 和 cookie 有什么差异?68.说一下session 的工作原理?69.若是客户端禁止cookie 能实现session 还能够用吗?70.spring mvc 和 struts 的差异是什么?71.如何防范sql 注入?72.什么是XSS 攻击,如何防范?73.什么是CSRF 攻击,如何防范?七、异常和throws的差异?75.final 、 finally 、 finalize 有什么差异?中哪个部分能够省略?中,若是catch 中 return了,finally还会执行吗?78.常有的异常类有哪些?八、网络响应码301 和 302 代表的是什么?有什么差异?和redirect的差异?81.简述tcp 和 udp 的差异?82.tcp 为什么要三次握手,两次不能够吗?为什么?83.说一下tcp 粘包是怎么产生的?84.OSI 的七层模型都有哪些?85.get 和 post 央求有哪些差异?86.如何实现跨域?87.说一下JSONP 实现原理?九、设计模式88.说一下你熟悉的设计模式?89.简单工厂和抽象工厂有什么差异?十、 Spring/Spring MVC90.为什么要使用spring?91.讲解一下什么是aop?92.讲解一下什么是ioc?93.spring 有哪些主要模块?94.spring 常用的注入方式有哪些?95.spring 中的bean 是线程安全的吗?96.spring 支持几种bean 的作用域?97.spring 自动装置bean 有哪些方式?98.spring 事务实现方式有哪些?99.说一下spring 的事务隔断?100.说一下spring mvc 运行流程?101.spring mvc 有哪些组件?102.@RequestMapping的作用是什么?103.@Autowired的作用是什么?十一、 Spring Boot/Spring Cloud104.什么是spring boot ?105.为什么要用spring boot ?106.spring boot核心配置文件是什么?107.spring boot配置文件有哪几各种类?它们有什么差异?108.spring boot有哪些方式能够实现热部署?109.jpa 和 hibernate有什么差异?110.什么是spring cloud ?111.spring cloud断路器的作用是什么?112.spring cloud的核心组件有哪些?十二、 Hibernate113.为什么要使用hibernate ?114.什么是ORM 框架?中如何在控制台查察打印的sql 语句?有几种盘问方式?实体类能够被定义为final吗?118.在 hibernate中使用Integer 和 int 做照射有什么差异?是如何工作的?120.get()和 load() 的差异?121.说一下hibernate的缓存体系?对象有哪些状态?123.在 hibernate中getCurrentSession和openSession的差异是什么?实体类必定要有无参构造函数吗?为什么?十三、 Mybatis中#{}和${}的差异是什么?126.mybatis 有几种分页方式?127.RowBounds 是一次性盘问全部结果吗?为什么?逻辑分页和物理分页的差异是什么?可否支持延缓加载?延缓加载的原理是什么?130.说一下mybatis 的一级缓存和二级缓存?和hibernate的差异有哪些?有哪些执行器(Executor)?分页插件的实现原理是什么?如何编写一个自定义插件?十四、 RabbitMQ的使用途景有哪些?有哪些重要的角色?有哪些重要的组件?中vhost的作用是什么?的信息是怎么发送的?怎么保证信息的牢固性?怎么防范信息扔掉?142.要保证信息长远化成功的条件有哪些?长远化有什么弊端?有几种广播种类?怎么实现延缓信息队列?集群有什么用?节点的种类有哪些?集群搭建需要注意哪些问题?每个节点是其他节点的完满拷贝吗?为什么?集群中唯一一个磁盘节点崩溃了会发生什么情况?对集群节点停止序次有要求吗?十五、 Kafka152.kafka 能够走开zookeeper 单独使用吗?为什么?153.kafka 有几种数据保留的策略?154.kafka 同时设置了7 天和10G 除去数据,到第五天的时候信息达到了10G,这个时候kafka 将如何办理?155.什么情况会以致kafka 运行变慢?156.使用kafka 集群需要注意什么?十六、 Zookeeper157.zookeeper 是什么?158.zookeeper 都有哪些功能?159.zookeeper 有几种部署模式?160.zookeeper 怎么保证主从节点的状态同步?161.集群中为什么要有主节点?162.集群中有 3 台服务器,其中一个节点宕机,这个时候zookeeper 还能够够使用吗?163.说一下zookeeper 的通知体系?十七、 MySql164.数据库的三范式是什么?165.一张自增表里面总合有7 条数据,删除了最后 2 条数据,重启mysql 数据库,又插入了一条数据,此时id 是几?166.如何获取当前数据库版本?167.说一下ACID 是什么?168.char 和 varchar 的差异是什么?和double的差异是什么?170.mysql 的内连接、左连接、右连接有什么差异?171.mysql 索引是怎么实现的?172.怎么考据mysql 的索引可否满足需求?173.说一下数据库的事务隔断?174.说一下mysql 常用的引擎?175.说一下mysql 的行锁和表锁?176.说一下乐观锁和悲观锁?177.mysql 问题排查都有哪些手段?178.如何做mysql 的性能优化?十八、 Redis179.redis 是什么?都有哪些使用途景?180.redis 有哪些功能?181.redis 和 memecache 有什么差异?182.redis 为什么是单线程的?183.什么是缓存穿透?怎么解决?184.redis 支持的数据种类有哪些?185.redis 支持的java 客户端都有哪些?186.jedis 和 redisson 有哪些差异?187.怎么保证缓存和数据库数据的一致性?188.redis 长远化有几种方式?189.redis 怎么实现分布式锁?190.redis 分布式锁有什么弊端?191.redis 如何做内存优化?192.redis 裁汰策略有哪些?193.redis 常有的性能问题有哪些?该如何解决?十九、 JVM194.说一下jvm 的主要组成部分?及其作用?195.说一下jvm 运行时数据区?196.说一下货仓的差异?197.队列和栈是什么?有什么差异?198.什么是双亲委派模型?199.说一下类加载的执行过程?200.怎么判断对象可否能够被回收?201.java 中都有哪些引用种类?202.说一下jvm 有哪些垃圾回收算法?203.说一下jvm 有哪些垃圾回收器?204.详细介绍一下CMS 垃圾回收器?205.再生代垃圾回收器和老生代垃圾回收器都有哪些?有什么差异?206.简述分代垃圾回收器是怎么工作的?207.说一下jvm 调优的工具?208.常用的jvm 调优的参数都有哪些?2、面试题答案汇总(一)基础模块(二)容器(三)多线程(四)反射(五)对象拷贝(六) JavaWeb(七)异常(八)网络(九)设计模式(十) Spring/SpringMVC(十一) Spring Boot / Spring Cloud (十二) Hibernate(十三) Mybatis(十四) RabbitMQ(十五) Kafka(十六) Zookeeper(十七) MySql(十八) Redis(十九) JVM。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2019年程序员考试面试题精选题
-求1+2+...+n
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态
的限制。
但这道题却能有效地考查发散思维水平,而发散思维水平能
反映出对编程相关技术理解的深刻水准。
通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种
思路。
因为已经明确限制for和while的使用,循环已经不能再用了。
同样,递归函数也需要用if语句或者条件判断语句来判断是继续递归
下去还是终止递归,但现在题目已经不允许使用这两种语句了。
我们仍然围绕循环做文章。
循环仅仅让相同的代码执行n遍而已,我
们完全能够不用for和while达到这个效果。
比如定义一个类,我们new一含有n个这种类型元素的数组,那么该类的构造函数将确定会被调用n次。
我们能够将需要执行的代码放到构造函数里。
如下代码正
是基于这个思路:
class Temp
public:
Temp() { ++ N; Sum += N; }
static void Reset() { N = 0; Sum = 0; }
static int GetSum() { return Sum; }
private:
static int N;
static int Sum;
};
int Temp::N = 0;
int Temp::Sum = 0;
int solution1_Sum(int n)
Temp::Reset();
Temp *a = new Temp[n];
delete []a;
a = 0;
return Temp::GetSum();
我们同样也能够围绕递归做文章。
既然不能判断是不是应该终止递归,我们不妨定义两个函数。
一个函数充当递归函数的角色,另一个函数
处理终止递归的情况,我们需要做的就是在两个函数里二选一。
从二
选一我们很自然的想到布尔变量,比如ture(1)的时候调用第一个函数,false(0)的时候调用第二个函数。
那现在的问题是如和把数值变量n
转换成布尔值。
如果对n连续做两次反运算,即!!n,那么非零的n转
换为true,0转换为false。
有了上述分析,我们再来看下面的代码:class A;
A* Array[2];
class A
public:
virtual int Sum (int n) { return 0; }
};
class B: public A
public:
virtual int Sum (int n) { return Array[!!n]->Sum(n-1)+n; }
};
int solution2_Sum(int n)
A a;
B b;
Array[0] = &a;
Array[1] = &b;
int value = Array[1]->Sum(n);
return value;
这种方法是用虚函数来实现函数的选择。
当n不为零时,执行函数B::Sum;当n为0时,执行A::Sum。
我们也能够直接用函数指针数组,
这样可能还更直接一些:
typedef int (*fun)(int);
int solution3_f1(int i)
return 0;
int solution3_f2(int i)
fun f[2]={solution3_f1, solution3_f2};
return i+f[!!i](i-1);
另外我们还能够让编译器帮我们来完成类似于递归的运算,比如如下
代码:
template struct solution4_Sum
enum Value { N = solution4_Sum::N + n};
};
template
enum Value { N = 1};
};
solution4_Sum::N就是1+2+...+100的结果。
当编译器看到
solution4_Sum时,就是为模板类solution4_Sum以参数100生成该类型的代码。
但以100为参数的类型需要得到以99为参数的类型,因为solution4_Sum::N=solution4_Sum::N+100。
这个过程会递归一直
到参数为1的类型,因为该类型已经显式定义,编译器无需生成,递
归编译到此结束。
因为这个过程是在编译过程中完成的,所以要求输
入n必须是在编译期间就能确定,不能动态输入。
这是该方法的缺点。
而且编译器对递归编译代码的递归深度是有限制的,也就是要求n不
能太大。