C++一些问题

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指向地址为起始地址的空间内。

strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

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)段页式管理。结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值