微软数据结构与算法100题1

来源:互联网 发布:如何欣赏交响乐 知乎 编辑:程序博客网 时间:2024/04/29 15:42

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

快速求斐波那契数列第N项

 

 

 

 

 

 

 

 

 

 

 

 

 

 

一个单链表的类,实现链表的反转 和链表的合并

 

 

 

 

写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)

功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr 所指内存。

例如:"abcd12345ed125ss123456789"的首地址传给intputstr 后,函数将返回9,outputstr 所指的值为123456789

 

 

 

 

 

58.从尾到头输出链表。

题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:

struct ListNode

{

 

      int       m_nKey;

 

      ListNode* m_pNext;

};

 

分析:这是一道很有意思的面试题。

该题以及它的变体经常出现在各大公司的面试、笔试题中。

 

 

 

不能被继承的类。

题目:用C++设计一个不能被继承的类。

 

分析:这是Adobe公司2007年校园招聘的最新笔试题。

这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目。

 

 

 
c++中为什么static成员函数不能声明为const
这是C++的规则
const修饰符用于表示函数不能修改成员变量的值,该函数必须是含有this指针的类成员函数,函数调用方式为thiscall
而类中的static函数本质上是全局函数,调用规约是__cdecl或__stdcall,不能用const来修饰它
类的static成员函数和const成员函数
static成员的特性 
  static成员函数没有this指针。
  static成员函数不能被声明为const。
  static成员函数也不能被声明为虚函数。
  static成员函数可以直接访问所属类的static成员,但不能直接使用非static成员。
  static数据成员的类型,可以是该成员所属的类类型。非static成员被限定声明为其自身类对象的指针或引用。 
  static数据成员可以作为成员函数的默认实参。非static数据成员,不能用作成员函数的默认实参,因为它的值不能独立于所属对象而使用。分析:静态成员函数如果未初始化,系统自动会给它初始化为某个缺省值(如int初始化为0, 指针初始化为NULL等)。 所以一旦定义,其值已确定,可以作为类成员函数的缺省参数。
   当在类的外部定义static成员时,无须重复指定static关键字。static关键字只能用于类定义体内部的声明中,定义不能标示为static。
 
  static数据成员必须在类定义体的外部定义正好一次。不像普通的数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时初始化。一般将static数据成员的定义放在包含类的非内联成员函数定义的文件中。 
  一般的讲,static数据成员和普通数据成员一样,不能在类的定义体中初始化。static数据成员一般在定义时候初始化。这个规则的一个例外是,只要初始化式是一个常量表达式,const static 数据成员就可以在类的定义体中初始化(Perimer上只写了const static 整形,经过测试发现string也可以):

 

 

 

 

在O(1)时间内删除链表结点。

题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:

struct ListNode

{

 

      int        m_nKey;

 

      ListNode*  m_pNext;

 

};

 

函数的声明如下:

void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);

 

http://blog.csdn.net/xianliti/archive/2010/06/11/5665179.aspx

 

 

 

 

54.调整数组顺序使奇数位于偶数前面。

题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,

所有偶数位于数组的后半部分。要求时间复杂度为O(n)。

 

 

 

 

 

52.二元树的深度。

题目:输入一棵二元树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

例如:输入二元树:

 

                                            10

                                          /     /

                                        6        14

                                      /         /   /

                                    4         12     16

 

输出该树的深度3。

 

二元树的结点定义如下:

struct SBinaryTreeNode // a node of the binary tree

{

      int               m_nValue; // value of node

      SBinaryTreeNode  *m_pLeft;  // left child of node

      SBinaryTreeNode  *m_pRight; // right child of node

};

分析:这道题本质上还是考查二元树的遍历。

 
53.字符串的排列。
题目:输入一个字符串,打印出该字符串中字符的所有排列。
例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
分析:这是一道很好的考查对递归理解的编程题,
因此在过去一年中频繁出现在各大公司的面试、笔试题中。
 
第二种方法:使用stl中的算法函数——stl全排列next_permutation(a,a+n)是对当前序列按字典顺序排序
http://apps.hi.baidu.com/share/detail/17354187
 

 

 

51.和为n连续正数序列。

题目:输入一个正数n,输出所有和为n连续正数序列。

 

例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。

分析:这是网易的一道面试题。

 

 

 

 

 

 

47.创新工场:

求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}

 
49.一道看上去很吓人的算法面试题:
如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
就是考查计数排序的!!!!!!
 

 

 

 

42.请修改append函数,利用这个函数实现:

两个非降序链表的并集,1->2->3 和 2->3->5 并为 1->2->3->5

另外只能输出结果,不能修改两个链表的数据。

 

 

 

原创粉丝点击