美团面试算法题

美团面试算法题
美团面试算法题

链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现

1.struct Node{

2.int data;

3.Node*next;

4.};

5.void reverse(Node*head,Node*end){

6.if(head==NULL||end==NULL)return;

7.Node*pre=NULL,*cur=head,*stop=end->next;

8.while(cur!=stop){

9.Node*nxt=cur->next;

10.cur->next=pre;

11.pre=cur;

12.cur=nxt;

13.}

14.}

15.

16.Node*reverseAll(Node*head,int k){

17.if(head==NULL||k<=0)return NULL;

18.Node*cur=head;

19.for(int i=0;i

20.cur=cur->next;

21.if(cur==NULL)

22.break;

23.}

24.if(cur==NULL)return head;

25.Node*begin=cur->next,*end=begin;

26.Node*pre=head;

27.reverse(head,cur);

28.

29.while(begin!=NULL){

30.for(int i=0;i

31.end=end->next;

32.if(end==NULL)

33.break;

34.}

35.if(end==NULL){

36.pre->next=begin;

37.break;

38.}

39.else{

40.Node*nextbegin=end->next;

41.reverse(begin,end);

42.pre->next=end;

43.pre=begin;

44.begin=end=nextbegin;

45.}

46.}

47.return cur;

48.}

49.

50.int main(){

51.int a[]={1,2,3,4,5,6,7,8,9,10,11,12};

52.Node*nd[12];

53.for(int i=0;i<12;i++){

54.nd[i]=new Node;

55.nd[i]->next=NULL;

56.nd[i]->data=a[i];

57.}

58.for(int i=0;i<11;i++){

59.nd[i]->next=nd[i+1];

60.}

61.Node*tmp=reverseAll(nd[0],4);

62.for(;tmp!=NULL;tmp=tmp->next){

63.cout<data<

64.}

65.system("pause");

66.return0;

67.}

快速幂运算

typedefunsignedint T;

Tfoo(Ta,Tb)因子不包含本身)

方法是以空间换时间.申请可以存放500万个整数的数组Divisor,数组存放每个数的亲和数.数n=Divisor[Divisor[n]]即为一对亲和数.

1.void Amicable_Pair(int n)

2.{

3.int*num=new int[n];

4.for(int i=0;i

5.num[i]=1;

6.for(int i=2;i<=n/2;i++)

7.{

8.int j=i+i;

9.while(j

10.{

11.num[j]+=i;

12.j+=i;

13.}

14.}//求出1-n的所有约数(除去本身)

15.for(int i=220;i

16.{

17.if(i

18.cout<

19.}

20.delete[]num;

21.}

数字IC设计笔试面试经典100题

1:什么是同步逻辑和异步逻辑?(汉王) 同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。 同步时序逻辑电路的特点:各触发器的时钟端全部连接在一起,并接在系统时钟端,只有当时钟脉冲到来时,电路的状态才能改变。改变后的状态将一直保持到下一个时钟脉冲的到来,此时无论外部输入x 有无变化,状态表中的每个状态都是稳定的。 异步时序逻辑电路的特点:电路中除可以使用带时钟的触发器外,还可以使用不带时钟的触发器和延迟元件作为存储元件,电路中没有统一的时钟,电路状态的改变由外部输入的变化直接引起。 2:同步电路和异步电路的区别: 同步电路:存储电路中所有触发器的时钟输入端都接同一个时钟脉冲源,因而所有触发器的状态的变化都与所加的时钟脉冲信号同步。 异步电路:电路没有统一的时钟,有些触发器的时钟输入端与时钟脉冲源相连,只有这些触发器的状态变化与时钟脉冲同步,而其他的触发器的状态变化不与时钟脉冲同步。 3:时序设计的实质: 时序设计的实质就是满足每一个触发器的建立/保持时间的要求。 4:建立时间与保持时间的概念? 建立时间:触发器在时钟上升沿到来之前,其数据输入端的数据必须保持不变的最小时间。保持时间:触发器在时钟上升沿到来之后,其数据输入端的数据必须保持不变的最小时间。 5:为什么触发器要满足建立时间和保持时间? 因为触发器内部数据的形成是需要一定的时间的,如果不满足建立和保持时间,触发器将进入亚稳态,进入亚稳态后触发器的输出将不稳定,在0和1之间变化,这时需要经过一个恢复时间,其输出才能稳定,但稳定后的值并不一定是你的输入值。这就是为什么要用两级触发器来同步异步输入信号。这样做可以防止由于异步输入信号对于本级时钟可能不满足建立保持时间而使本级触发器产生的亚稳态传播到后面逻辑中,导致亚稳态的传播。 (比较容易理解的方式)换个方式理解:需要建立时间是因为触发器的D端像一个锁存器在接受数据,为了稳定的设置前级门的状态需要一段稳定时间;需要保持时间是因为在时钟沿到来之后,触发器要通过反馈来锁存状态,从后级门传到前级门需要时间。 6:什么是亚稳态?为什么两级触发器可以防止亚稳态传播? 这也是一个异步电路同步化的问题。亚稳态是指触发器无法在某个规定的时间段内到达一个可以确认的状态。使用两级触发器来使异步电路同步化的电路其实叫做“一位同步器”,他只能用来对一位异步信号进行同步。两级触发器可防止亚稳态传播的原理:假设第一级触发器的输入不满足其建立保持时间,它在第一个脉冲沿到来后输出的数据就为亚稳态,那么在下一个脉冲沿到来之前,其输出的亚稳态数据在一段恢复时间后必须稳定下来,而且稳定的数据必须满足第二级触发器的建立时间,如果都满足了,在下一个脉冲沿到来时,第二级触发器将不会出现亚稳态,因为其输入端的数据满足其建立保持时间。同步器有效的条件:第一级触发器进入亚稳态后的恢复时间+ 第二级触发器的建立时间< = 时钟周期。

计算机常见算法面试题

简介:计算机考研之家搜集的华为C语言经典面试题,来试试你的C语言水平吧。每道题都附有详细解答和讲解,很有参考价值的C语言面试题。 怎么判断链表中是否有环? bool CircleInList(Link* pHead) { if(pHead = = NULL || pHead->next = = NULL)//无节点或只有一个节点并且无自环 return (false); if(pHead->next = = pHead)//自环 return (true); Link *pTemp1 = pHead;//step 1 Link *pTemp = pHead->next;//step 2 while(pTemp != pTemp1 && pTemp != NULL && pTemp->next != NULL) { pTemp1 = pTemp1->next; pTemp = pTemp->next->next; } if(pTemp = = pTemp1) return (true); return (false); } 两个字符串,s,t;把t字符串插入到s字符串中,s字符串有足够的空间存放t字符串 void insert(char *s, char *t, int i) { memcpy(&s[strlen(t)+i],&s[i],strlen(s)-i); memcpy(&s[i],t,strlen(t)); s[strlen(s)+strlen(t)]='\0'; } 1。编写一个C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。 char * search(char *cpSource, char ch) { char *cpTemp=NULL, *cpDest=NULL; int iTemp, iCount=0; while(*cpSource) { if(*cpSource == ch) { iTemp = 0; cpTemp = cpSource; while(*cpSource == ch) ++iTemp, ++cpSource; if(iTemp > iCount)

[第1题-60题汇总]微软数据结构+算法面试100题

精选微软等公司数据结构 精选微软等公司数据结构++算法面试100题 -----[第1题-60题总] 资源说明: 此份,是为微软等公司数据结构+算法面试100题,之前60题的汇总。 总结整理了前第1题-第60题。特此并作此一份上传。以飨各位。:)。 -------------------------------- 相关资源,包括答案,下载地址: [答案V0.2版]精选微软数据结构+算法面试100题[前20题]--答案修正 https://www.360docs.net/doc/2c604217.html,/source/2813890 //此份答案是针对最初的V0.1版本,进行的校正与修正。 [答案V0.1版]精选微软数据结构+算法面试100题[前25题] https://www.360docs.net/doc/2c604217.html,/source/2796735 [第二部分]精选微软等公司结构+算法面试100题[前41-60题]: https://www.360docs.net/doc/2c604217.html,/source/2811703 [第一部分]精选微软等公司数据结构+算法经典面试100题[1-40题] https://www.360docs.net/doc/2c604217.html,/source/2778852 更多资源,下载地址: http://v_july_https://www.360docs.net/doc/2c604217.html,/ 很快,我将公布第21-40题的答案,敬请期待。:).. 如果你对以下的前第1-60题,有好的思路,和算法,欢迎跟帖回复, 或者,联系我,发至我的邮箱, zhoulei0907@https://www.360docs.net/doc/2c604217.html,。 My CSDN Blog:https://www.360docs.net/doc/2c604217.html,/v_JULY_v My sina Blog:https://www.360docs.net/doc/2c604217.html,/shitou009 帖子维护地址: [整理]算法面试:精选微软经典的算法面试100题[前1-60题] https://www.360docs.net/doc/2c604217.html,/u/20101023/20/5652ccd7-d510-4c10-9671-307a56006e6d.html -------------------------------------- July、2010、/11.12.请享用。:)。 1

25道常见算法面试题

Problem 1 : Is it a loop ? (判断链表是否有环?) Assume that wehave a head pointer to a link-list. Also assumethat we know the list is single-linked. Can you come up an algorithm to checkwhether this link list includes a loop by using O(n) time and O(1) space wheren is the length of the list? Furthermore, can you do so with O(n) time and onlyone register? 方法:使用两个指针,从头开始,一个一次前进一个节点,一个前进2个节点,则最多2N,后两个指针可以重合;如果无环,则正常停止。 同样的,可以找到链表的中间节点。同上。 Problem 2:设计一个复杂度为n的算法找到链表倒数第m个元素。最后一个元素假定是倒数第0个。 提示:双指针查找 Problem 3:用最简单的方法判断一个LONG整形的数A是2^n(2的n次方)提示:x&(x-1) Problem 4:两个烧杯,一个放糖一个放盐,用勺子舀一勺糖到盐,搅拌均匀,然后舀一勺混合物会放糖的烧杯,问你两个烧杯哪个杂质多? 提示:相同。假设杂质不等,那么将杂质放回原杯中,则杯中物体重量必变化,不合理。

Problem 5:给你a、b两个文件,各存放50亿条url,每条url各占用64字节,内存限制是4G,让你找出a、b文件共同的url。 法1:使用hash表。使用a中元素创建hash表,hash控制在适当规模。在hash中查找b的元素,找不到的url先存在新文件中,下次查找。如果找到,则将相应的hash表项删除,当hash表项少于某个阈值时,将a中新元素重新hash。再次循环。 法2:对于hash表项增加一项记录属于的文件a,b。只要不存在的表项即放入hash表中,一致的项则删除。注意:可能存在很多重复项,引起插入,删除频繁。 Problem 6:给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词。 提示:将每个的单词按照字母排序,则兄弟单词拥有一致的字母排序(作为单词签名)。使用单词签名来查找兄弟单词。 Problem 7:五桶球,一桶不正常,不知道球的重量和轻重关系,用天平称一次找出那桶不正常的球。

2017年数字IC设计工程师招聘面试笔试100题附答案

2017年数字IC设计工程师招聘面试笔试100 题附答案 1:什么是同步逻辑和异步逻辑?(汉王) 同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。 同步时序逻辑电路的特点:各触发器的时钟端全部连接在一起,并接在系统时钟端,只有当时钟脉冲到来时,电路的状态才能改变。改变后的状态将一直保持到下一个时钟脉冲的到来,此时无论外部输入x 有无变化,状态表中的每个状态都是稳定的。 异步时序逻辑电路的特点:电路中除可以使用带时钟的触发器外,还可以使用不带时钟的触发器和延迟元件作为存储元件,电路中没有统一的时钟,电路状态的改变由外部输入的变化直接引起。 2:同步电路和异步电路的区别: 同步电路:存储电路中所有触发器的时钟输入端都接同一个时钟脉冲源,因而所有触发器的状态的变化都与所加的时钟脉冲信号同步。 异步电路:电路没有统一的时钟,有些触发器的时钟输入端与时钟脉冲源相连,只有这些触发器的状态变化与时钟脉冲同步,而其他的触发器的状态变化不与时钟脉冲同步。 3:时序设计的实质: 时序设计的实质就是满足每一个触发器的建立/保持时间的要求。

4:建立时间与保持时间的概念? 建立时间:触发器在时钟上升沿到来之前,其数据输入端的数据必须保持不变的最小时间。 保持时间:触发器在时钟上升沿到来之后,其数据输入端的数据必须保持不变的最小时间。 5:为什么触发器要满足建立时间和保持时间? 因为触发器内部数据的形成是需要一定的时间的,如果不满足建立和保持时间,触发器将进入亚稳态,进入亚稳态后触发器的输出将不稳定,在0和1之间变化,这时需要经过一个恢复时间,其输出才能稳定,但稳定后的值并不一定是你的输入值。这就是为什么要用两级触发器来同步异步输入信号。这样做可以防止由于异步输入信号对于本级时钟可能不满足建立保持时间而使本级触发器产生的亚稳态传播到后面逻辑中,导致亚稳态的传播。 (比较容易理解的方式)换个方式理解:需要建立时间是因为触发器的D端像一个锁存器在接受数据,为了稳定的设置前级门的状态需要一段稳定时间;需要保持时间是因为在时钟沿到来之后,触发器要通过反馈来锁存状态,从后级门传到前级门需要时间。 6:什么是亚稳态?为什么两级触发器可以防止亚稳态传播?

数据结构算法面试100题

数据结构+算法面试100题~~~摘自CSDN,作者July 1.把二元查找树转变成排序的双向链表(树) 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14 / / / / 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 首先我们定义的二元查找树节点的数据结构如下: struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node }; 2.设计包含min函数的栈(栈) 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、push以及pop的时间复杂度都是O(1)。 参见C:\Users\Administrator\Desktop\demo\Stack 分析:min时间复杂度要达到O(1),需要我们在栈中存储最小元素 3.求子数组的最大和(数组) 题目: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。 分析:根据dp思想 #include #define N 8 int main() { int i, a[N] = {1, -2, 3, 10, -4, 7, 2, -5}; int from[N], result[N], max;

经典算法类笔试或面试题及答案

常见算法笔试或面试题 1、Is it a loop ? (判断链表是否有环?) Assume that we have a head pointer to a link-list. Also assume that we know the list is single-linked. Can you come up an algorithm to check whether this link list includes a loop by using O(n) time and O(1) space where n is the length of the list? Furthermore, can you do so with O(n) time and only one register? 方法:使用两个指针,从头开始,一个一次前进一个节点,一个前进2个节点,则最多2N,后两个指针可以重合;如果无环,则正常停止。同样的,可以找到链表的中间节点。同上。 2、设计一个复杂度为n的算法找到链表倒数第m个元素。最后一个元素假定是倒数第0个。 提示:双指针查找 3、用最简单的方法判断一个LONG整形的数A是2^n(2的n次方) 提示:x&(x-1) 4、两个烧杯,一个放糖一个放盐,用勺子舀一勺糖到盐,搅拌均匀,然后舀一勺混合物会放糖的烧杯,问你两个烧杯哪个杂质多? 提示:相同。假设杂质不等,那么将杂质放回原杯中,则杯中物体重量必变化,不合理。 5、给你a、b两个文件,各存放50亿条url,每条url各占用64字节,内存限制是4G,让你找出a、b文件共同的url。 方法一:使用hash表。使用a中元素创建hash表,hash控制在适当规模。在hash中查找b的元素,找不到的url先存在新文件中,下次查找。如果找到,则将相应的hash表项删除,当hash表项少于某个阈值时,将a中新元素重新hash。再次循环。 方法二:对于hash表项增加一项记录属于的文件a,b。只要不存在的表项即放入hash表中,一致的项则删除。注意:可能存在很多重复项,引起插入,删除频繁。 6、给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单

推荐算法实习生招聘笔试题

BIGO 2019春季实习生招聘笔试题(推荐技术平台部--机器学习工程师)姓名:________________ 学校:____________________ 专业:______________________ 编号:________________ 手机号码:______________________ 评分:____________ 共5题,总分共100分,笔试时间共60分钟。 1. 请列举几个logistic regression对特征进行离散化的优点,并介绍几种将连续特征离散 化的方法。(20分) 2. 盒子中有一些蓝球和红球,随机从里面取两个出来,是两个红球的概率恰好为0.5,则 (1) 盒子里至少有几个球? (2) 若蓝球有偶数个,则至少有几个球?。 (20分) 3. 求数组众数: (1)一个数组中,已知某一个数值出现次数超过数组总个数的一半,请找出这个数. (2)一个数组中,已知某两个数值出现次数均超过数组总个数的1/3,请找出这两个数. 请编码实现,函数接口定义如下: vector majorityElement(vector& nums) {}; (也可以选择自己熟悉的编程语言实现) 要求:时间复杂度不大于O(n),空间复杂度不大于O(1). 提示:不能改变原数组,否则空间复杂度相当于O(n). (20分) 4.给定数据的产生概率模型P(D|θ),其中D为独立的数据点。从这些观测中如何估计参数θ,请列举至少两种估计方法,并比较不同方法的联系与区别。(20分) 5 水平数轴上有两种移动方式,一种是往左或往右移动一个单位,一种是从X位置直接传送到2X位置,输入目标位置整数Y,请给出算法计算从原点到Y的最少移动次数。

编程面试的10大算法概念汇总

编程面试中排名前10的算法 通过一些简单的例子来阐述这些概念。由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍。本文将从Java的角度看问题,包含下面的这些概念: 1. 字符串 2. 链表 3. 树 4. 图 5. 排序 6. 递归vs. 迭代 7. 动态规划 8. 位操作 9. 概率问题 10. 排列组合 1. 字符串 如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法。 1 2 3 4 5 6 toCharArray() // 获得字符串对应的char数组Arrays.sort() // 数组排序 Arrays.toString(char[] a) // 数组转成字符串charAt(int x) // 获得某个索引处的字符length() // 字符串长度 length // 数组大小 2. 链表 在Java中,链表的实现非常简单,每个节点Node都有一个值val和指向下个节点的链接next。 1 2 3 4 class Node { int val; Node next;

5 6 7 8 9 Node(int x) { val = x; next = null; } } 链表两个著名的应用是栈Stack和队列Queue。栈: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Stack{ Node top; public Node peek(){ if(top != null){ return top; } return null; } public Node pop(){ if(top == null){ return null; }else{ Node temp = new Node(top.val); top = top.next; return temp; }

java基本算法面试题

【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 public class lianxi01 { public static void main(String[] args) { System.out.println("第1个月的兔子对数: 1"); System.out.println("第2个月的兔子对数: 1"); int f1 = 1, f2 = 1, f, M=24; for(int i=3; i<=M; i++) { f = f2; f2 = f1 + f2;//(每次兔子的对数均为一个月前与两个月前的兔子对数的和) f1 = f; System.out.println("第" + i +"个月的兔子对数: "+f2); } } } 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 public class lianxi02 { public static void main(String[] args) { int count = 0; for(int i=101; i<200; i+=2) { boolean b = false; for(int j=2; j<=Math.sqrt(i); j++) { if(i % j == 0) { b = false; break; } else { b = true; } } if(b == true) {count ++;System.out.println(i );} } System.out.println( "素数个数是: " + count); } } 【程序3】 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。 public class lianxi03 { public static void main(String[] args) { int b1, b2, b3;

2014华为校园招聘笔试算法题汇总

华为2014笔试算法题汇总 1.通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。 比如字符串“abacacde”过滤结果为“abcde”。 要求实现函数:void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr); 【输入】pInputStr:输入字符串 lInputLen:输入字符串长度 【输出】pOutputStr:输出字符串,空间已经开辟好,与输入字符串等长; 【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出 示例 输入:“deefd”输出:“def” 输入:“afafafaf”输出:“af” 输入:“pppppppp”输出:“p” main函数已经隐藏,这里保留给用户的测试入口,在这里测试你的实现函数,可以调用printf打印输出 当前你可以使用其他方法测试,只要保证最终程序能正确执行即可,该函数实现可以任意修改,但是不要改变函数原型。 一定要保证编译运行不受影响 [cpp] view plaincopy ////////////////////////////////////////////////////////////////////////// #include #include

using namespace std; bool g_flag[26]; void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr) { assert(pInputStr != NULL); int i = 0; if (pInputStr == NULL || lInputLen <= 1) { return; } const char *p = pInputStr; while(*p != '\0') { if (g_flag[(*p - 'a')]) { p++; }else{ pOutputStr[i++] = *p; g_flag[*p - 'a'] = 1; p++; } }

数据结构及算法招聘笔试及面试

数据结构及算法招聘笔试及面试 一、综述: 招聘考试中笔试偏基础知识考察,面试偏项目经验和算法的灵活应用的考察。考察的内容可以分为知识型题目和智力测试类的题目,平时可以充分准备知识型的题目,而智力测试类的题目在知名大公司的考察较多,可以多看一些典型的题目,争取能在应试中将其转换为记忆力的测试。 在软件类的应聘考试中要坚持“两个中心,三个基本点”。“两个中心”是以数据结构与算法为中心。对于计算机专业的人才来说,数据结构,算法应该是基石,也就是重中之重。这一点在牛企中更为突出,像百度,微软,google这样的企业,对这“两个中心”的要求更是高。“三个基本点”分别为程序设计语言,操作系统,数据库及网络。程序设计语言无论是java或者c++,你都要精通,也就是说要非常熟练。高水平的公司,对应聘者的综合素质跟专业知识要求都很高,专业知识方面数据结构算法尤为重要,所以大家如果有志于目前牛气的公司的话,一定要真的做到“精通” 数据结构与算法,其中排序算法最最重要。这里说的精通不但要能快速书写基本的典型的算法,而且要真正理解,灵活运用,做到举一反三,考察往往不是原原本本的考察知识点,而是进行略微的变化再考察,如果理解的不深刻,往往调到陷阱中。所以,大家要养成“反思”的习惯,即经常思考所学的知识。同时要多读书,多读经典的书籍,例如:《编程之美》,《C陷阱与缺陷》,《C和指针》,《计算机程序设计艺术(共四卷)》《数据结构C语言版》。 二:考察点 结合数据结构的知识点,主要考察的内容如下: 1、数据结构本质的理解:数据结构是解决复杂程序的建模问题的,如何将现实世界中的复杂多样的关系(1:1,1:n,n:m)在计算机的简单的一维内存结构中进行处理,如何利用现有的计算机资源高效的解决问题。逻辑结构、存储结构的关系。 2、算法的渐近时间复杂度和渐近空间复杂度的估计。 3、线性表的单链表和双向链表的操作 4、栈和队列应用,主要是递归算法如何转换为非递归算法。 5、串的模式匹配算法,数组的地址下标计算,和特殊矩阵的压缩存储,特别是稀疏矩阵的三元组存储结构和一次定位的快速转秩算法。 6、二叉树的5条性质,二叉树的四种遍历算法的递归和非递归实现,及其时间和空间复杂度。哈夫曼树的概念、存储结

数据结构与算法面试题

目录 1. 数组 (3) 2. 链表 (5) 3. 栈 (9) 4. 队列 (10) 5. 堆(优先队列) (12) 6. 二叉树 (15) 7. 二叉查找树 (24) 8. 字典树 (26) 9. 平衡树(AVL) (26) 10. 红黑树 (26) 11. B树/B+树 (28) 12. 哈希 (29) 13. 图 (31) 14. 字符串 (33) 15. 排序 (36) 16. 二分查找 (40) 17. 跳跃列表 (41) 18. 动态规划 (42) 1.数组 应用场景: 1)数据比较少 2)经常做的运算是按序号访问数据元素 面试题 选择题: 1)对于长度为n的线性表,建立其对应的单链表的时间复杂度为()。 O(1) O(log2n) O(n) O(n^2) 2)下列哪些不是线性表? 队列 栈 关联数组 链表 3)稀疏矩阵一般的压缩存储方法有两种,即() 二维数组和三维数组 三元组和散列 三元组和十字链表 散列和十字链表 4)将10阶对称矩阵压缩存储到一维数组A中,则数组A的长度最少为

100 40 55 80 5) 设A是n*n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序存放在一维数组B[1..n(n+1)/2]中,对上述任一元素aij (1≤i,j≤n,且i≤j)在B中的位置为() i(i-1)/2+j j(j-1)/2+i j(j-1)/2+i-1 i(i-1)/2+j-1 6)若有定义: int c[4][5],( *pc)[5]; pc=c; 那么,下列对数组C的元素引用正确的是( )。 pc+1 * (pc+3) * (pc+1) +3 * (*pc+2) 问答题: 1)数组和链表的区别 思路: 从逻辑结构上来看,数组必须实现定于固定的长度,不能适应数据动态增减的情况,即数组的大小一旦定义就不能改变。当数据增加是,可能超过原先定义的元素的个数;当数据减少时,造成内存浪费;链表动态进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。 从内存存储的角度看;数组从栈中分配空间(用new则在堆上创建),对程序员方便快速,但是自由度小;链表从堆中分配空间,自由度大但是申请管理比较麻烦。 从访问方式类看,数组在内存中是连续的存储,因此可以利用下标索引进行访问;链表是链式存储结构,在访问元素时候只能够通过线性方式由前到后顺序的访问,所以访问效率比数组要低。 2)输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n) 思路: Step1.从头到尾逐个累加数组中的每个数字,初始化和为0;(nCurrSum=0,nGreatestNum=int.MinValue) Step2.首先加上第一个数字,从第二个数字开始累加,依次将累加和保存到一个临时变量(nCurrSum)中; Step3.如果当前累加和(nCurrSum)小于0,那抛弃前面的子数组和,从下一个数字开始重新累加;相反,则将当前累加和(nCurrSum)与返回累加和(nGreatestNum)进行比较,如果nCurrSum>nGreatestNum,则更新nGreatestNum。

JAVA经典算法面试10题及答案

JAVA经典算法面试10题及答案 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21 . public class exp2{ public static void main(string args[]){ int i=0; for(i=1;i i++) system.out.println(f(i)); } public static int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); }}或public class exp2{ public static void main(string args[]){ int i=0; math mymath = new math(); for(i=1;i i++) system.out.println(mymath.f(i)); }}class math{ public int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); }}【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 public class exp2{ public static void main(string args[]){ int i=0; math mymath = new math(); for(i=2;i =200;i++) if(mymath.iszhishu(i)==true) system.out.println(i); }}class math{ public int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } public boolean iszhishu(int x) { for(int i=2;i =x/2;i++) if (x % 2==0 ) return false; return true; }}【程序3】题目:打印出所有的水仙花数,所谓水仙花数是指一个三位数,其

(完整版)数据结构与算法面试题80道

由于这些题,实在太火了。所以,应广大网友建议要求,在此把之前已整理公布的前80题,现在,一次性分享出来。此也算是前80题第一次集体亮相。 此些题,已有上万人,看到或见识到,若私自据为己有,必定为有知之人识破,付出代价。所以,作者声明: 本人July对以上所有任何内容和资料享有版权,转载请注明作者本人July出处。 向你的厚道致敬。谢谢。 ---------------------------------------------------------------------------------------------------------------- 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 首先我们定义的二元查找树节点的数据结构如下: struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node };

2.设计包含min函数的栈。 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、push以及pop的时间复杂度都是O(1)。 3.求子数组的最大和 题目: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。 4.在二元树中找出和为某一的所有路径 题目:输入一个整数和一棵二元树。 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 打印出和与输入整数相等的所有路径。 例如输入整数22和如下二元树 10 / \ 5 12 / \ 4 7 则打印出两条路径:10, 12和10, 5, 7。 二元树节点的数据结构定义为: struct BinaryTreeNode // a node in the binary tree {

数据结构与算法面试题80道

数据结构与算法面试题80道

由于这些题,实在太火了。因此,应广大网友建议要求,在此把之前已整理公布的前80题, 现在,一次性分享出来。此也算是前80题第一次集体亮相。 此些题,已有上万人,看到或见识到,若私自据为己有,必定为有知之人识破,付出代价。 因此,作者声明: 本人July对以上所有任何内容和资料享有版权,转载请注明作者本人July出处。 向你的厚道致敬。谢谢。 ---------------------------------------------------------------------------------------------------------------- 1.把二元查找树转变成排序的双向链表 题目:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创立任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 首先我们定义的二元查找树节点的数据结构如下: struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node }; 2.设计包含min函数的栈。

定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、push以及pop的时间复杂度都是O(1)。 3.求子数组的最大和 题目: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。 4.在二元树中找出和为某一的所有路径

数据结构+算法面试100题

数据结构+算法面试100题~~~摘自CSDN 作者July 1. 把二元查找树转变成排序的双向链表(树) 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14 / / / / 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 首先我们定义的二元查找树 节点的数据结构如下: struct BSTreeNode { int m_nValue; 计包含 min 函数的栈(栈) 定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素。 要求函数 min 、 push 以及 pop 的时间复杂度都是 O (1) 。 参见 C:\Users\Administrator\Desktop\demo\Stack 分析: min 时间复杂度要达到 O (1 ) ,需要我们在栈中存储最小元素 3. 求子数组的最大和(数组) 题目: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为 例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5 因此输出为该子数组的和 18。 分析:根据 dp 思想 #include <> #define N 8 int main() { int i, a[N] = {1, -2, 3, 10, -4, 7, 2, -5}; int from[N], result[N], max; max = 0; from[0] = 0; result[0] = a[0]; for (i = 1; i < N; ++i) { if (result[i - 1] > 0) { from[i] = from[i - 1]; result[i] = a[i] + result[i - 1]; } else { from[i] = i; result[i] = a[i]; } if (result[i] > result[max]) max = i; } printf("%d->%d: %d\n", from[max], max, result[max]); O(n)。 ,和最大的子数组为 3, 10, -4, 7, 2

面试_微软面试100题全部答案

本文自CSDN大牛的一篇博客:https://www.360docs.net/doc/2c604217.html,/v_july_v/article/details/6870251 作者:July、阿财 时间:二零一一年十月十三日。 我能够看到此文,还要多同学!让我得以及时分享给大家 微软面试100题全部答案 个人整理的前60题的答案可参见以下三篇文章: 1.微软100题第1题-20题答案https://www.360docs.net/doc/2c604217.html,/v_JULY_v/archive/2011/01/10/6126406.aspx [博 文 I] 2.微软100题第21-40题答案https://www.360docs.net/doc/2c604217.html,/v_JULY_v/archive/2011/01/10/6126444.aspx[博文 II] 3.微软100题第41-60题答案https://www.360docs.net/doc/2c604217.html,/v_JULY_v/archive/2011/02/01/6171539.aspx[博文 III] 最新整理的全部100题的答案参见如下(重复的,以及一些无关紧要的题目跳过): 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 首先我们定义的二元查找树节点的数据结构如下: struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node }; ANSWER: This is a traditional problem that can be solved using recursion. For each node, connect the double linked lists created from left and right child node to form a full list. /** * param root The root node of the tree

计算机找工作笔试题集锦(详解)_算法问题

1. 题目射击运动员10发打中90环有多少种可能,请编写程序计算出来,并打印出结果,0环和10环均有效 答案递归算法: #include #include int f(int n, int m) { //n次射中m环 int fn=0,i; if(m<0||m>10*n) return 0; if(n==1) return 1; for(i=0;i<=10;i++) //本次射中的为i环,剩下的n-1次要射m-i环 fn+=f(n-1,m-i); return fn; } int main() { int n,m; printf("Please enter n and m:"); scanf("%d%d",&n,&m); printf("\n%d发打中%d环有%d种可能.\n",n,m,f(n,m)); system("PAUSE"); return 0; } 非递归算法: 算法分析: 由于中90环和中10环的概率是一样的 (可用数学归纳法证明) 所以在此只需穷举和10的个数即可。 count = 0; for(a=0;a<=10;a++) for(b=0;b<=10-a;b++) for(c=0;c<=10-a-b;c++) for(d=0;d<=10-a-b-c;d++) for(e=0;e<=10-a-b-c-d;e++) for(f=0;f<=10-a-b-c-d-e;f++) for(g=0;g<=10-a-b-c-d-e-f;g++) for(h=0;h<=10-a-b-c-d-e-f-g;h++) for(i=0;h<=10-a-b-c-d-e-f-g-h;i++) for(j=0;h<=10-a-b-c-d-e-f-g-h-i;j++) { count++; } printf("%d\n",count);

相关主题
相关文档
最新文档