自我介绍()
问了项目,项目原理以及怎么实现,项目难点。
滴滴一面
前两个是C 后面几个是JAVA
1. 局部变量和全局变量:
在函数内部定义的变量,在本函数内才能引用,在此函数外不能引用;
在函数外部定义的变量,可以在本文件中被其他函数引用;
2. Static 在C中的作用 static 在Java中的作用
在C中,static用于普通变量和函数,在全局变量前加上static,该变量就被定义为一个静态全局变量:在全局数据区分配内存,静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;未经初始化的静态全局变量会被程序自动初始化为0。静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突;
在Java中,static修饰的静态变量被所有对象所共享,在内存中只有一个副本, static 修饰的静态方法不能访问非静态的成员变量和非静态的成员方法。 static 修饰内部类的实例方法不能访问外部类的实例属性。
3. HashMap 以及HashMap怎么扩容
Map的底层实现是数组、链表 。Map用于保存具有映射关系的数据,存放键值对,根据键对象 Key找对应的值对象Value 。
HashMap 是线程不安全、效率高;允许null作为key 和value 。
为了在HashMap 中存储对象,用key对象必须实现hashCode()方法和equals()方法
HashMap 当前数组容量不够时,使用新数组代替旧数组,数据长度是原来的2倍,将原数组的值映射到新数组即可。
4. 怎么判断二进制中1的个数
方法1:Flag =1 把n与1相与,然后1左移,再和n做与运算 。
方法2: n&(n-1) 把一个整数减1,再把原整数做与运算,会把该整数最右边的1
5. 说一种最熟悉的排序算法
希尔排序:缩小增量排序 复杂度O(NlongN) 不稳定 较复杂
希尔排序在数组中采用跳跃式分组策略,直至增量为1,使得整个数组在初始阶段达到宏观上基本有序,小的基本在前,大的基本在后面。
根据增量,把数组进行分组,每组记录采用直接插入排序方法排序。增量选择比较重要:gap = len/3+1;
6. 海量数据中找重复的前10条
方法1:可以用哈希表方法:将海量数据分成若干组,边扫描散列表。
第一次扫描,取首字节、尾字节、中间作为hashcode 插入到hashtable。并记录地址信息和重复次数。
第二次扫描,用线性时间选择可在O(N)完成前10条寻找。分组后每份中的top 10必须保证各不相同,可用hash来保证。也可以直接按hash值的大小来分类。
方法2:从小到大排序。根据经验,除非群发的过节短信,否则字数越少出现的重复率越高。先搜索1个字及重复次数,再搜索2个字及重复次数。对于相同字数的比较长的短信的搜索,可以选择只抽取头、中和尾等几个位置的字符进行粗判,因为此种判断方式是为了加快查找速度但未必能得到真正期望的top10,因此需要做标记;
再可以从各次top10结果中找到备选的top10,如果这top10中有刚才做过标记的,则对其对应的所有短信进行精确搜索以找到真正的top10并在此比较