面试题总结6

1、虚函数的实现机制。

虚函数发生在继承当中,子类与父类之间可以有不同的方法,或者同一个方法名有不同的实现,从而体现了类的多态性质。具体实现是通过一个虚函数表,可以通过类对象的地址找到虚函数表的地址,虚函数表中保存的是类方法的地址,如果子类与父类的函数名不一样,那么子类方法放在虚函数表前面,父类方法放在虚函数表后面。如果子类方法有个父类方法同名的,那么子类方法将覆盖父类方面在虚函数中的位置。

2、static关键字的作用。

  • 被static修饰的变量,它的声明周期直到整个程序结束,被分配到静态存储区。
  • 可以被模块内的其它函数使用,可以看作是一个全局变量。
  • 被声明为static的函数只能被模块内的其它函数调用。
3、const关键字的作用。

const表示修饰的成分是一个值不可改变的变量,可以理解为只读类型。

4、n!末尾所包含零的个数。

5!=120,末尾一个0,10阶乘末尾2个0,20的阶乘末尾4个0,可以得到递推公式:当0<n<5时,f(n) = 0;当n>=5时,f(n) = k+f(k!),其中k = n/5;

证明:首先我们知道在一堆乘法中产生0的途径只有2*5得到10,所以有几对2,5就可以得到几个0.下面我们可以将n!分解,n!= [5k * 5(k-1) * ... * 10 * 5] * a,其中 n = 5k + r (0 <= r <= 4),a是一个不含因子“5”的整数。对于序列5,10,15,······,5(k-1),5k,中每一个数都含有因子5,并且在区间(5(k-1),5k) 内总有一个2产生一个0,将上述序列提出一个5得到n!= 5^k * k! * a,其中k!可以递归的得到其满足结论1.

           有了上面的结论,我们知道f(n!) 只与5因子个数有关。f(n!) =  f(5^k * k! * a) = k + f(k!) = k + f(k!),其中k = n / 5(取整)。

5、递归实现单链表逆转。

Node *Reverse(Node *head)
{
 Node *p=head;
 if(p==NULL)
     return NULL;     //若是空链表,返回空
 Node *q=p->next;
 if(q==NULL)
     return p;     //若只有一个结点,直接返回
 else
     head=Reverse(q);  //记录子序列的新的头结点
 q->next=p;     //当前结点与已经逆置的子序列看成是前后的两个结点p,q,作相应的逆置操作
 p->next=NULL;
 return head;      //返回新的子序列的头结点
}

6、N个人围一圈,数第m个人出来,然后从第m个人下一个人开始继续数,直到只剩下一个人,求剩下的人的编号。

int main()
{
	int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int sum = 10, num = 5;
	int i = 0;
	while (sum > 1)
	{
		num = 5;
		while (num > 0)
		{

			if (a[i] != -1)
			{
				num--;
				if (num == 0)
				{
					a[i] = -1;
				}
			}
			i = (i + 1) % 10;
		}
		sum--;
	}
	for (i = 0; i < 10; i++)
	{
	
		cout << a[i]<<" "<< endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

feng_blog6688

只需一个赞,谢谢你的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值