腾讯笔试题(2014软件开发)回忆录

1.     有关于堆和栈的问题

1)  栈区(stack)―  由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2)  堆区(heap) ―  一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3)  全局区(静态区)(static)―,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放

4)  文字常量区  ―常量字符串就是放在这里的。 程序结束后由系统释放

5)  程序代码区―存放函数体的二进制代码。

 

堆和栈的几点对比:

1)  栈由系统自动分配,速度较快。但程序员是无法控制的。堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

2)  栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。堆的大小受限于计算机系统中有效的虚拟内存。

3)  栈是向低地址扩展的数据结构,是一块连续的内存的区域,堆是向高地址扩展的数据结构,是不连续的内存区域。

2.有1、2、5分钱足够多,凑成1块钱有几种方法?答案541

(引用)我们来解决一个更加总泛的问题:给定p种不同的硬币,面值分别为{v1, v2, ..., vp},和一个金额n,问有多少种组合的方法。

用函数c(m, q)来表示仅仅使用前q种硬币组成金额m的方法数。我们可以用递归式来定义这个函数如下:

之所以加入一个参数q,是为了在缩小问题规模时,除去因为硬币排列顺序的不同而带来的计数重复。比如第三种情况里,仅仅使用前q种硬币组成金额m的方法,可以划为两个分离的部分:仅仅使用前q-1种硬币组成金额m的方法,以及,至少使用了一个第q种硬币来组成金额m的方法。这种划分即没有重复也没有遗漏。而且,"至少使用了一个第q种硬币来组成金额m的方法"的数目等于“仅仅使用前q种硬币来组成金额的方法”的数目,因为前者不过是在后者的每一种组合里增加一个第q种硬币。

 

通过以上的分析,我们可以写出如下的算法来解决这个问题:

NUM-OF-COMBINATIONS(n,k, v)//使用前k种硬币,组成面值为n,面值分别为{v1, v2, ..., vp}

if n = 0

    return 1

else if n < 0 ork <= 0

    return 0

else

    return NUM-OF-COMBINATIONS(n, k-1, v) +NUM-OF-COMBINATION(n-v[k], k, v)

 

3.基类与父类指针与虚函数,多态

 

class Base
{
public:
	virtual int foo(int n){return n*10;}
	int foo(char ch){return 1;}
	~Base(){};
};
class Child:public Base
{
public:
	int foo(int n){return n*20;}
	virtual int foo(char ch){return 2;}
	~Child(){};
};

int main()
{
	Child objChild;
	Base *pBase = &objChild;

	cout<<(pBase->foo(100)+pBase->foo('a'))<<endl;
}
输出2001.

foo(100)执行时由于基类的

virtual int foo(int n){return n*10;}

是虚函数,所以父类对象保存了该虚函数的虚表指针,能够实现多态。

而基类

详细介绍请见:


 

4.比较次数与记录的排列无关的排序方法:

答案是直接选择排序!因为不管初始排列次序是相对正序还是相对乱序,选择排序对关键字的比较次数都是相同的!因为它每一次都要选出关键字中最小的!

 

5.哈弗曼编码

 

单链表中判断链表环算法最少需要几个指针

算法的思想是设定两个指针p, q,其中p每次向前移动一步,q每次向前移动两步。那么如果单链表存在环,则pq相遇;否则q将首先遇到null

可参见博客:

http://www.cnblogs.com/zhyg6516/archive/2011/03/29/1998831.html

 

6.死锁相关的判断!

 

7.编译原理,编译器与解释器的区别。编译的什么阶段会出现parse Tree(解析树)

编译器内部包括了许多步骤或称为阶段源代码(phase),它们执行不同的逻辑操作;

扫描程序(scanner):在这个阶段编译器实际阅读源程序(通常以分析程序字符流的形式表示)。扫描程序执行词法分析注释树符号表(Lexicalanalysis );

语法分析parser):语法分析程序从扫描程序中获取记号形式的源代码,并完成定义程序结构的语法分析(syntaxanalysis ),这与自然语言中句子的语法分析类似。语法分析定义了程序的结构元素及其关系。通常将语法分析的结果表示为分析树(parsetree)或语法树(syntaxtree)。

语义分析(semantic analyzer):程序的语义就是它的“意思”,它与语法或结构不同。程序的语义确定程序的运行,但是大多数的程序设计语言都具有在执行之前被确定而不易由语法表示和由分析程序分析的特征

优化程序

代码生成

参照:

http://baike.baidu.com/link?url=kyq2qYiYSJFUaTwzizXAF1Y1vd1GMbUWl_tNLBwjspmXsD1LmuXH2rk8Jw4fxxtFYqSQKikQ5CVPCphks9vx3_

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值