1、if-else语句和switch-case语句的效率分析对比
switch效率高。switch的效率与分支数无关,当只有分支比较少的时候,if效率比switch高,因为switch有跳转表。分支比较多,那当然是switch
根据大量的实际程序测试(不考虑不同的编译器优化程度差异,假设都是最好的优化),那么Switch语句击中第三个选项的时间跟if/else if语句击中第三个选项的时间相同。击中第一,第二选项的速度if语句快,击中第四以及第四之后的选项的速度switch语句快。
switch的优缺点
缺点:不够灵活,switch仅支持 int,char,unsigned char 等基本类型;代码空间大。
优点:代码结构清晰,效率高
if else的优缺点
缺点:效率低(相对于switch)
优点:使用灵活,代码空间小
2、strcpy、memcpy、memset、strlen
char * strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||(strSrc==NULL))
throw "Invalid argument(s)";
char * strDestCopy=strDest;
while ((*strDest++=*strSrc++)!='\0');
return strDestCopy;
}
这个测试用例并没有考虑到拷贝时内存重叠的情况,改写如下:
char *my_strcpy(char *dst,const char *src)
{
assert(dst != NULL);
assert(src != NULL);
char *ret = dst;
memcpy(dst,src,strlen(src)+1);
return ret;
}
int strlen( const char *str )
{
assert( strt != NULL ); //断言字符串地址非0
int len;
while( (*str++) != '\0' )
{
len++;
}
return len;
}
void *memcpy(void*dest, const void *src, size_t n);
//由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。
3、静态全局变量和动态全局变量的区别
全局变量本身就是静态存储方式,所以二者在存储方式上相同。
非静态全局变量的作用域是整个源程序,当源程序由多个源文件构成时,在各个源文件中都是有效的;
静态全局变量只在该变量的源文件内有效。
4、用两个堆栈实现一个队列
入队时,将元素压入s1。
出队时,判断s2是否为空,如不为空,则直接弹出顶元素;如为空,则将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。
如果两个都为空的话需要加入异常处理,也就是在实际写代码的时候考虑的要全面。
5、本周淘宝上有5亿个商品成交数据,让你找出销量最高的10000个商品
建立一个优先队列,也就是最小堆,堆大小为10000,如果当前销量比堆顶要大,该商品入队,堆顶出队。时间复杂度为O(nlogm),n为总的元素个数,m为优先队列长度
6、阿里旺旺里人和人之间交流产生了很多个商业群,要我找出一共有多少个不同的群。
并查集
7、列举面向对象的三个基本要素和五个基本原则
三个基本要素:继承、封装、多态
五个基本原则:单一职责原则:是指只有一种单一功能,不要为类实现过多的功能点,以保证实体只有一个引起它变化的原因。
开放封闭原则:软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。
Liskov替换原则:子类必须能够替换基类。这是对继承机制的约束规范,保证继承复用的基础。但基类不能替换子类。
依赖倒置原则:依赖于抽象。高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。 抽象的稳定 性决定了系统的稳定性,因为抽象是不变的,依赖于抽象是面向对象设计的精髓,也是依赖倒置原则的核心。
接口隔离原则:使用多个小的专门的接口,避免使用大的接口。一个类对另一个类的依赖应该建立在最小的接口上。将胖接口分解为多个特 点的定制化方法,使得客户端仅仅依赖于它们的实际调用的方法,从而解除了客户端不会依赖于它们不用的方法。
8、Windows内存管理的几种方式及优缺点。
(1)块式管理。把主存分为一大块、一大块的,当所需的程序片段不在主存时就分配一块主存空间,把程序片段加载到主存,就算所需要的程序片段只有几个字节也只能把这块分配给它。优点:易于管理;缺点:浪费空间。
(2)页式管理。把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方式的空间利用率要比块式管理高出很多。
(3)段式管理。把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上比页式管理高出很多,但也有另外一个缺点,一个程序片段可能会被分为几十个段,这样很多时间就会浪费在计算每一段的物理地址上。(I/O操作)
(4)段页式管理。结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。