腾讯笔试题

1、请定义一个宏,比较两个数a、b 的大小,不能使用大于、小于、if 语句

#define max(a,b) (((a-b)&(1<<31))?(b):(a))

 

2、如何输出源文件的标题和目前执行行的行数

1)__DATE__:当前文件的编译日期。与在time.h中定义的asctime函数返回的格式一样,即是Mmm DD yyyy(月、日、年);
2)__FILE__:当前源文件的名称。字符串格式(const char);
3)__LINE__:当前代码在源文件中的行数。一个整数。
4)__TIME__:当前源文件的编译时间。一个字符串(hh:mm:ss);
5)__TIMESTAMP__:当前源文件最后编译的日期时间。一个字符串(格式为:Ddd Mmm Date hh:mm:ss yyyy,即星期几、月、日、时、分、秒、年);

其中通过宏__FILE__和__LIEN__可以快速的定位程序出错的文件和位置,并通过Email的形式发送给开发人员,从而进行快速维护。

 

3、两个数相乘,小数点后位数没有限制,请写一个高精度算法

纪录小数点在a,b中的位置

去掉a,b中的小数点

计算c=a*b; (同整数的大数相乘算法)

 加上小数点

 

4、有A、B、C、D 四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1、2、5、10 分钟,只有一支手电,并且同时最多只能两个人一起过桥。
请问,如何安排,能够在17 分钟内这四个人都过桥?

去:AB---------------------------------2

回:A-----------------------------------1

去:CD---------------------------------10

回:B------------------------------------2

去:AB----------------------------------2

 

5、C++将父类的析构函数定义为虚函数,下列正确的是哪个?
A、释放父类指针时能正确释放子类对象
B、释放子类指针时能正确释放父类对象
C、这样做是错误的
D、以上全错
C++的多态肯定是使用父类的指针指向子类的对象,所以肯定是释放子类的对象,如果不使用虚函数的话,父类的指针就只能够释放父类的对象。

 

6、typedef char *String_t; 和 #define String_d char * 这两句在使用上有什么区别?
答:typedef char *String_t 定义了一个新的类型别名,有类型检查。而#define String_d char * 只是做了个简单的替换,无类型检查,前者在编译的时候处理,后者在预编译的时候处理。

 

7、给定一个字符串,求出其最长的重复子串

#include<iostream>
using namespace std;
int main()
{
	char str[]="huahuahuahualkjljlkdf";
	int len=strlen(str);
	int i;
	int j;
	int k=0;
	int first;
	int max=0;
	for (i=1;i<len;i++)
	{
		for (j=0;j<i;j++)
		{
			if (str[j]==str[i+k])
			{
				k++;
			}
			else
			{
				k=0;
			}
			if (k>max)
			{
				max=k;
				first=j+1-max;
			}
		}
		k=0;
	}
	
	cout<<"子串长度:"<<max<<endl;
	for (i=first;i<(first+max);i++)
	{
		cout<<str[i];
	}
	cout<<endl;
	return 0;
}


 

 8、给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。在构造过程:
不允许使用除法;
要求O(1)空间复杂度和O(n)时间复杂度;
除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);
请用程序实现并简单描述。

 

 解答:

迭代计算:

i前的部分:

b[0]=1

b[1]=a[0]=b[0]*a[0]

b[2]=a[0]*a[1]=b[1]*a[1];

 b[3]=a[0]*a[1]*a[2]=b[2]*a[2]

..........

b[N-2]=b[N-3]*a[N-3]

 

i后半部分

b[0]=a[N-1]

b[N-2]=b[N-2]*a[N-1]=b[N-2]*b[0]   b[0]=b[0]*a[N-2]

b[N-3]=b[N-3]*b[0]

......

 

代码:

#include<iostream>
using namespace std;
#define N 10
int main()
{
	int a[N];
	int b[N];
	int i;
	cout<<"请输入"<<N<<"个数字"<<endl;
	for (i=0;i<N;i++)
	{
		cin>>a[i];
	}
	b[0]=1;
	for (i=1;i<N;i++)
	{
		b[i] =b[i-1]*a[i-1];
	}
	b[0]=a[N-1];
	for (i=N-2;i>=1;i--)
	{
		b[i] *= b[0];
		b[0] *= a[i];
	}
	for (i=0;i<N;i++)
	{
		cout<<b[i]<<" ";
	}
	cout<<endl;
	return 0;
}


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值