** 回答问题的套路
1 知无不言,言无不尽
2 对待面试题 尽量有一个递进式的回答
3 面对理论性的对比,从大往小了说 概述->细节
*问题1: 如何求两个int型的平均数
思考: int型对数的限制 如果是两个足够大并且相同符号的数的话 相加后会超出int型范围
所以考虑一个算法,让很大的数相加也不会超出限定值。
但是如果两个数异号即使很大相加也不会超出范围 所以用正常办法
编写代码; 1 判断两个数的符号是否相等(用异或^ 的办法去判断符号位,相同为0,不同为1)
2 如果符号相同则:min+(max-min)/2;
3 如果符号不同则:(max+min)/2;
*问题2: 如何在很多数中找到中位数
思考: 当在数据很多的时候按照正常做法排序,然后去找中位数效率会大大降低
所以在考虑到数据很多的时候则: 1 将数据转化成2进制
2 如果有正有负那么中位数一定在多的数据里
3 所以从符号位判断0多还是1多 然后去掉少的那部分
4 依次判断知道数据量较小时可以用排序然后寻找中位数的方法做
*问题3: 设计一个一百亿计算器
思考: 首先要明白这道题目的考查点是什么
要知道加减法的位运算原理和知道计算机中的算术运算会发生越界的情况
所以要用到java中BigInteger(专门用于数很大时候的计算)
可以参看jdk中自带的java.math.BigInteger类的源码
====================================================================================================
关于问题的总结:
面对简单的问题要留心,要尽可能的考虑周全,尽量的考虑到多种情况,考虑到数据量很大时的情况。
感觉一般运算的问题,转化成2进制去思考,可能会更好的解决问题。