当前位置:文档之家› 算法大全-面试题-数据结构

算法大全-面试题-数据结构

算法大全-面试题-数据结构
算法大全-面试题-数据结构

一、单链表

目录

1.单链表反转

2.找出单链表的倒数第4个元素

3.找出单链表的中间元素

4.删除无头单链表的一个节点

5.两个不交叉的有序链表的合并

6.有个二级单链表,其中每个元素都含有一个指向一个单链表的指针。写程序把这个二级链表称一级单链表。

7.单链表交换任意两个元素(不包括表头)

8.判断单链表是否有环?如何找到环的“起始”点?如何知道环的长度?

9.判断两个单链表是否相交

10.两个单链表相交,计算相交点

11.用链表模拟大整数加法运算

12.单链表排序

13.删除单链表中重复的元素

首先写一个单链表的C#实现,这是我们的基石:

public class Link

{

public Link Next;

public string Data;

public Link(Link next, string data)

{

this.Next = next;

this.Data = data;

}

}

其中,我们需要人为地在单链表前面加一个空节点,称其为head。例如,一个单链表是1->2->5,如图所示:

对一个单链表的遍历如下所示:

static void Main(string[] args)

{

Link head = GenerateLink();

Link curr = head;

while (curr != null)

{

Console.WriteLine(curr.Data);

curr = curr.Next;

}

}

1.单链表反转

这道题目有两种算法,既然是要反转,那么肯定是要破坏原有的数据结构的:算法1:我们需要额外的两个变量来存储当前节点curr的下一个节点next、再下一个节点nextnext:

public static Link ReverseLink1(Link head)

{

Link curr = head.Next;

Link next = null;

Link nextnext = null;

//if no elements or only one element exists

if (curr == null || curr.Next == null)

{

return head;

}

//if more than one element

while (curr.Next != null)

{

next = curr.Next; //1

nextnext = next.Next; //2

next.Next = head.Next; //3

head.Next = next; //4

curr.Next = nextnext; //5

}

return head;

}

算法的核心是while循环中的5句话

我们发现,curr始终指向第1个元素。

此外,出于编程的严谨性,还要考虑2种极特殊的情况:没有元素的单链表,以及只有一个元素的单链表,都是不需要反转的。

算法2:自然是递归

如果题目简化为逆序输出这个单链表,那么递归是很简单的,在递归函数之后输出当前元素,这样能确保输出第N个元素语句永远在第N+1个递归函数之后执行,也就是说第N个元素永远在第N+1个元素之后输出,最终我们先输出最后一个元素,然后是倒数第2个、倒数第3个,直到输出第1个:

public static void ReverseLink2(Link head)

{

if (head.Next != null)

{

ReverseLink2(head.Next);

Console.WriteLine(head.Next.Data);

}

}

但是,现实应用中往往不是要求我们逆序输出(不损坏原有的单链表),而是把这个单链表逆序(破坏型)。这就要求我们在递归的时候,还要处理递归后的逻辑。

首先,要把判断单链表有0或1个元素这部分逻辑独立出来,而不需要在递归中每次都比较一次:

public static Link ReverseLink3(Link head)

{

//if no elements or only one element exists

if (head.Next == null || head.Next.Next == null)

return head;

head.Next = ReverseLink(head.Next);

return head;

}

我们观测到:

head.Next = ReverseLink(head.Next);

这句话的意思是为ReverseLink方法生成的逆序链表添加一个空表头。

接下来就是递归的核心算法ReverseLink了:

static Link ReverseLink(Link head)

{

if (head.Next == null)

return head;

Link rHead = ReverseLink(head.Next);

head.Next.Next = head;

head.Next = null;

return rHead;

}

算法的关键就在于递归后的两条语句:

head.Next.Next = head; //1

head.Next = null; //2

啥意思呢?画个图表示就是:

这样,就得到了一个逆序的单链表,我们只用到了1个额外的变量rHead。

2.找出单链表的倒数第4个元素

这道题目有两种算法,但无论哪种算法,都要考虑单链表少于4个元素的情况:第1种算法,建立两个指针,第一个先走4步,然后第2个指针也开始走,两个指针步伐(前进速度)一致。

static Link GetLast4thOne(Link head)

{

Link first = head;

Link second = head;

for (int i = 0; i < 4; i++)

{

if (first.Next == null)

throw new Exception("Less than 4 elements");

first = first.Next;

}

while (first != null)

{

first = first.Next;

second = second.Next;

}

return second;

}

第2种算法,做一个数组arr[4],让我们遍历单链表,把第0个、第4个、第8个……第4N个扔到arr[0],把第1个、第5个、第9个……第4N+1个扔到arr[1],把第2个、第6个、第10个……第4N+2个扔到arr[2],把第3个、第7个、第11个……第4N+3个扔到arr[3],这样随着单链表的遍历结束,arr中存储的就是单链表的最后4个元素,找到最后一个元素对应的arr[i],让k=(i+1)%4,则arr[k]就是倒数第4个元素。

static Link GetLast4thOneByArray(Link head)

{

Link curr = head;

int i = 0;

Link[] arr = new Link[4];

while (curr.Next != null)

{

arr[i] = curr.Next;

curr = curr.Next;

i = (i + 1) % 4;

}

if (arr[i] == null)

throw new Exception("Less than 4 elements");

return arr[i];

}

本题目源代码下载:

推而广之,对倒数第K个元素,都能用以上2种算法找出来。

3.找出单链表的中间元素

算法思想:类似于上题,还是使用两个指针first和second,只是first每次走一步,second每次走两步:

static Link GetMiddleOne(Link head)

{

Link first = head;

Link second = head;

while (first != null && first.Next != null)

{

first = first.Next.Next;

second = second.Next;

}

return second;

}

但是,这道题目有个地方需要注意,就是对于链表元素个数为奇数,以上算法成立。如果链表元素个数为偶数,那么在返回second的同时,还要返回second.Next 也就是下一个元素,它俩都算是单链表的中间元素。

下面是加强版的算法,无论奇数偶数,一概通杀:

static void Main(string[] args)

{

Link head = GenerateLink();

bool isOdd = true;

Link middle = GetMiddleOne(head, ref isOdd);

if (isOdd)

{

Console.WriteLine(middle.Data);

}

else

{

Console.WriteLine(middle.Data);

Console.WriteLine(middle.Next.Data);

}

Console.Read();

}

static Link GetMiddleOne(Link head, ref bool isOdd)

{

Link first = head;

Link second = head;

while (first != null && first.Next != null)

{

first = first.Next.Next;

second = second.Next;

}

if (first != null)

isOdd = false;

return second;

}

4.一个单链表,很长,遍历一遍很慢,我们仅知道一个指向某节点的指针curr,而我们又想删除这个节点。

这道题目是典型的“狸猫换太子”,如下图所示:

如果不考虑任何特殊情况,代码就2行:

curr.Data = curr.Next.Data;

curr.Next = curr.Next.Next;

上述代码由一个地方需要注意,就是如果要删除的是最后一个元素呢?那就只能从头遍历一次找到倒数第二个节点了。

此外,这道题目的一个变身就是将一个环状单链表拆开(即删除其中一个元素),此时,只要使用上面那两行代码就可以了,不需要考虑表尾。

相关问题:只给定单链表中某个结点p(非空结点),在p前面插入一个结点q。

话说,交换单链表任意两个节点,也可以用交换值的方法。但这样就没意思了,所以,才会有第7题霸王硬上工的做法。

5.两个不交叉的有序链表的合并

有两个有序链表,各自内部是有序的,但是两个链表之间是无序的。

算法思路:当然是循环逐项比较两个链表了,如果一个到了头,就不比较了,直接加上去。

注意,对于2个元素的Data相等(仅仅是Data相等哦,而不是相同的引用),我们可以把它视作前面的Data大于后面的Data,从而节省了算法逻辑。

static Link MergeTwoLink(Link head1, Link head2)

{

Link head = new Link(null, Int16.MinValue);

Link pre = head;

Link curr = head.Next;

Link curr1 = head1;

Link curr2 = head2;

//compare until one link run to the end

while (curr1.Next != null && curr2.Next != null)

{

if (curr1.Next.Data < curr2.Next.Data)

{

curr = new Link(null, curr1.Next.Data);

curr1 = curr1.Next;

}

else

{

curr = new Link(null, curr2.Next.Data);

curr2 = curr2.Next;

}

pre.Next = curr;

pre = pre.Next;

}

//if head1 run to the end

while (curr1.Next != null)

{

curr = new Link(null, curr1.Next.Data);

curr1 = curr1.Next;

pre.Next = curr;

pre = pre.Next;

}

//if head2 run to the end

while (curr2.Next != null)

{

curr = new Link(null, curr2.Next.Data);

curr2 = curr2.Next;

pre.Next = curr;

pre = pre.Next;

}

return head;

}

如果这两个有序链表交叉组成了Y型呢,比如说:

这时我们需要先找出这个交叉点(图中是11),这个算法参见第9题,我们这里直接使用第10道题目中的方法GetIntersect。

然后局部修改上面的算法,只要其中一个链表到达了交叉点,就直接把另一个链表的剩余元素都加上去。如下所示:

static Link MergeTwoLink2(Link head1, Link head2)

{

Link head = new Link(null, Int16.MinValue);

Link pre = head;

Link curr = head.Next;

Link intersect = GetIntersect(head1, head2);

Link curr1 = head1;

Link curr2 = head2;

//compare until one link run to the intersect

while (curr1.Next != intersect && curr2.Next != intersect)

{

if (curr1.Next.Data < curr2.Next.Data)

{

curr = new Link(null, curr1.Next.Data);

curr1 = curr1.Next;

}

else

{

curr = new Link(null, curr2.Next.Data);

curr2 = curr2.Next;

}

pre.Next = curr;

pre = pre.Next;

}

//if head1 run to the intersect

if (curr1.Next == intersect)

{

while (curr2.Next != null)

{

curr = new Link(null, curr2.Next.Data);

curr2 = curr2.Next;

pre.Next = curr;

pre = pre.Next;

}

}

//if head2 run to the intersect

else if (curr2.Next == intersect)

{

while (curr1.Next != null)

{

curr = new Link(null, curr1.Next.Data);

curr1 = curr1.Next;

pre.Next = curr;

pre = pre.Next;

}

}

return head;

}

6.有个二级单链表,其中每个元素都含有一个指向一个单链表的指针。写程序把这个二级链表展开称一级单链表。

这个简单,就是说,这个二级单链表只包括一些head:

public class Link

{

public Link Next;

public int Data;

public Link(Link next, int data)

{

this.Next = next;

this.Data = data;

}

}

public class CascadeLink

{

public Link Next;

public CascadeLink NextHead;

public CascadeLink(CascadeLink nextHead, Link next)

{

this.Next = next;

this.NextHead = nextHead;

}

}

下面做一个二级单链表,GenerateLink1和GenerateLink2方法在前面都已经介绍过了:

public static CascadeLink GenerateCascadeLink()

{

Link head1 = GenerateLink1();

Link head2 = GenerateLink2();

Link head3 = GenerateLink1();

CascadeLink element3 = new CascadeLink(null, head3);

CascadeLink element2 = new CascadeLink(element3, head2);

CascadeLink element1 = new CascadeLink(element2, head1);

CascadeLink head = new CascadeLink(element1, null);

return head;

}

就是说,这些单链表的表头head1、head2、head3、head4……,它们组成了一个二级单链表head:null –> head1 –> head2 –> head3 –> head4

–>

我们的算法思想是:进行两次遍历,在外层用curr1遍历二级单链表head,在内层用curr2遍历每个单链表:

public static Link GenerateNewLink(CascadeLink head)

{

CascadeLink curr1 = head.NextHead;

Link newHead = curr1.Next;

Link curr2 = newHead;

while (curr1 != null)

{

curr2.Next = curr1.Next.Next;

while (curr2.Next != null)

{

curr2 = curr2.Next;

}

curr1 = curr1.NextHead;

}

return newHead;

}

其中,curr2.Next = curr1.Next.Next; 这句话是关键,它负责把上一个单链表的表尾和下一个单链表的非空表头连接起来。

7.单链表交换任意两个元素(不包括表头)

先一次遍历找到这两个元素curr1和curr2,同时存储这两个元素的前驱元素pre1和pre2。

然后大换血

public static Link SwitchPoints(Link head, Link p, Link q)

{

if (p == head || q == head)

throw new Exception("No exchange with head");

if (p == q)

return head;

//find p and q in the link

Link curr = head;

Link curr1 = p;

Link curr2 = q;

Link pre1 = null;

Link pre2 = null;

int count = 0;

while (curr != null)

{

if (curr.Next == p)

{

pre1 = curr;

count++;

if (count == 2)

break;

}

else if (curr.Next == q)

{

pre2 = curr;

count++;

if (count == 2)

break;

}

curr = curr.Next;

}

curr = curr1.Next;

pre1.Next = curr2;

curr1.Next = curr2.Next;

pre2.Next = curr1;

curr2.Next = curr;

return head;

}

注意特例,如果相同元素,就没有必要交换;如果有一个是表头,就不交换。

8.判断单链表是否有环?如何找到环的“起始”点?如何知道环的长度?

算法思想:

先分析是否有环。为此我们建立两个指针,从header一起向前跑,一个步长为1,一个步长为2,用while(直到步长2的跑到结尾)检查两个指针是否相等,直到找到为止。

static bool JudgeCircleExists(Link head)

{

Link first = head; //1 step each time

Link second = head; //2 steps each time

while (second.Next != null && second.Next.Next != null)

{

second = second.Next.Next;

first = first.Next;

if (second == first)

return true;

}

return false;

}

那又如何知道环的长度呢?

根据上面的算法,在返回true的地方,也就是2个指针相遇处,这个位置的节点P肯定位于环上。我们从这个节点开始先前走,转了一圈肯定能回来:

static int GetCircleLength(Link point)

{

int length = 1;

Link curr = point;

while (curr.Next != point)

{

length++;

curr = curr.Next;

return length;

}

继续我们的讨论,如何找到环的“起始”点呢?

延续上面的思路,我们仍然在返回true的地方P,计算一下从有环单链表的表头head到P点的距离

static int GetLengthFromHeadToPoint(Link head, Link point)

{

int length = 1;

Link curr = head;

while (curr != point)

{

length++;

curr = curr.Next;

}

return length;

}

如果我们把环从P点“切开”(当然并不是真的切,那就破坏原来的数据结构了),那么问题就转化为计算两个相交“单链表”的交点(第10题):

一个单链表是从P点出发,到达P(一个回圈),距离M;另一个单链表从有环单链表的表头head出发,到达P,距离N。

我们可以参考第10题的GetIntersect方法并稍作修改。

private static Link FindIntersect(Link head)

{

Link p = null;

//get the point in the circle

bool result = JudgeCircleExists(head, ref p);

if (!result) return null;

Link curr1 = head.Next;

Link curr2 = p.Next;

//length from head to p

int M = 1;

while (curr1 != p)

{

M++;

curr1 = curr1.Next;

}

//circle length

int N = 1;

while (curr2 != p)

N++;

curr2 = curr2.Next;

}

//recover curr1 & curr2

curr1 = head.Next;

curr2 = p.Next;

//make 2 links have the same distance to the intersect

if (M > N)

{

for (int i = 0; i < M - N; i++)

curr1 = curr1.Next;

}

else if (M < N)

{

for (int i = 0; i < N - M; i++)

curr2 = curr2.Next;

}

//goto the intersect

while (curr1 != p)

{

if (curr1 == curr2)

{

return curr1;

}

curr1 = curr1.Next;

curr2 = curr2.Next;

}

return null;

}

9.判断两个单链表是否相交

这道题有多种算法。

算法1:把第一个链表逐项存在hashtable中,遍历第2个链表的每一项,如果能在第一个链表中找到,则必然相交。

static bool JudgeIntersectLink1(Link head1, Link head2)

{

Hashtable ht = new Hashtable();

Link curr1 = head1;

Link curr2 = head2;

//store all the elements of link1

while (curr1.Next != null)

{

ht[curr1.Next] = string.Empty;

curr1 = curr1.Next;

}

//check all the elements in link2 if exists in Hashtable or not

while (curr2.Next != null)

{

//if exists

if (ht[curr2.Next] != null)

{

return true;

}

curr2 = curr2.Next;

}

return false;

}

算法2:把一个链表A接在另一个链表B的末尾,如果有环,则必然相交。如何判断有环呢?从A开始遍历,如果能回到A的表头,则肯定有环。

注意,在返回结果之前,要把刚才连接上的两个链表断开,恢复原状。

static bool JudgeIntersectLink2(Link head1, Link head2)

{

bool exists = false;

Link curr1 = head1;

Link curr2 = head2;

//goto the end of the link1

while (curr1.Next != null)

{

curr1 = curr1.Next;

}

//join these two links

curr1.Next = head2;

//iterate link2

while (curr2.Next != null)

{

if (curr2.Next == head2)

{

exists = true;

break;

}

curr2 = curr2.Next;

//recover original status, whether exists or not

curr1.Next = null;

return exists;

}

算法3:如果两个链表的末尾元素相同,则必相交。

static bool JudgeIntersectLink3(Link head1, Link head2)

{

Link curr1 = head1;

Link curr2 = head2;

//goto the end of the link1

while (curr1.Next != null)

{

curr1 = curr1.Next;

}

//goto the end of the link2

while (curr2.Next != null)

{

curr2 = curr2.Next;

}

if (curr1 != curr2)

return false;

else

return true;

}

10.两个单链表相交,计算相交点

分别遍历两个单链表,计算出它们的长度M和N,假设M比N大,则长度M 的链表先前进M-N,然后两个链表同时以步长1前进,前进的同时比较当前的元素,如果相同,则必是交点。

public static Link GetIntersect(Link head1, Link head2)

{

Link curr1 = head1;

Link curr2 = head2;

int M = 0, N = 0;

//goto the end of the link1

while (curr1.Next != null)

{

curr1 = curr1.Next;

M++;

//goto the end of the link2

while (curr2.Next != null)

{

curr2 = curr2.Next;

N++;

}

//return to the begining of the link

curr1 = head1;

curr2 = head2;

if (M > N)

{

for (int i = 0; i < M - N; i++)

curr1 = curr1.Next;

}

else if (M < N)

{

for (int i = 0; i < N - M; i++)

curr2 = curr2.Next;

}

while (curr1.Next != null)

{

if (curr1 == curr2)

{

return curr1;

}

curr1 = curr1.Next;

curr2 = curr2.Next;

}

return null;

}

11.用链表模拟大整数加法运算

例如:9>9>9>NULL + 1>NULL =>

1>0>0>0>NULL

肯定是使用递归啦,不然没办法解决进位+1问题,因为这时候要让前面的节点加1,而我们的单链表是永远指向前的。

此外对于999+1=1000,新得到的值的位数(4位)比原来的两个值(1个1位,1个3位)都多,所以我们将表头的值设置为0,如果多出一位来,就暂时存放到表头。递归结束后,如果表头为1,就在新的链表外再加一个新的表头。

//head1 length > head2, so M > N

public static int Add(Link head1, Link head2, ref Link newHead, int M, int N)

{

// goto the end

if (head1 == null)

return 0;

int temp = 0;

int result = 0;

newHead = new Link(null, 0);

if (M > N)

{

result = Add(head1.Next, head2, ref newHead.Next, M - 1, N);

temp = head1.Data + result;

newHead.Data = temp % 10;

return temp >= 10

1 : 0;

}

else // M == N

{

result = Add(head1.Next, head2.Next, ref newHead.Next, M - 1, N - 1);

temp = head1.Data + head2.Data + +result;

newHead.Data = temp % 10;

return temp >= 10

1 : 0;

}

}

这里假设head1比head2长,而且M、N分别是head1和head2的长度。

12.单链表排序

无外乎是冒泡、选择、插入等排序方法。关键是交换算法,需要额外考虑。第7题我编写了一个交换算法,在本题的排序过程中,我们可以在外层和内层循环里面,捕捉到pre1和pre2,然后进行交换,而无需每次交换又要遍历一次单链表。在实践中,我发现冒泡排序和选择排序都要求内层循环从链表的末尾向前走,这明显是不合时宜的。

所以我最终选择了插入排序算法,如下所示:

先给出基于数组的算法:

代码

staticint[]

InsertSort(int[]arr)

{

for(inti=1;i

{

for(intj=i;(j>0)&&arr[j]

{

arr[j]=arr[j]^arr[j-1];

arr[j-1]=arr[j]^arr[j-1];

arr[j]=arr[j]^arr[j-1];

}

}

returnarr;

}

仿照上面的思想,我们来编写基于Link的算法:

public static Link SortLink(Link head)

{

Link pre1 = head;

Link pre2 = head.Next;

Link min = null;

for (Link curr1 = head.Next; curr1 != null; curr1 = min.Next)

{

if (curr1.Next == null)

break;

min = curr1;

for (Link curr2 = curr1.Next; curr2 != null; curr2 = curr2.Next)

{

//swap curr1 and curr2

if (curr2.Data < curr1.Data)

{

min = curr2;

curr2 = curr1;

curr1 = min;

pre1.Next = curr1;

curr2.Next = curr1.Next;

curr1.Next = pre2;

//if exchange element n-1 and n, no need to add reference from pre2 to curr2, because they are the same one

if (pre2 != curr2)

pre2.Next = curr2;

}

pre2 = curr2;

}

pre1 = min;

pre2 = min.Next;

}

return head;

}

值得注意的是,很多人的算法不能交换相邻两个元素,这是因为pre2和curr2是相等的,如果此时还执行pre2.Next = curr2; 会造成一个自己引用自己的环。

交换指针很是麻烦,而且效率也不高,需要经常排序的东西最好不要用链表来实现,还是数组好一些。

13.删除单链表中重复的元素

用Hashtable辅助,遍历一遍单链表就能搞定。

实践中发现,curr从表头开始,每次判断下一个元素https://www.doczj.com/doc/1117998757.html,x是否重复,如果重复直接使用curr.Next = curr.Next.Next; 就可以删除重复元素——这是最好的算法。唯一的例外就是表尾,所以到达表尾,就break跳出while循环。public static Link DeleteDuplexElements(Link head)

{

Hashtable ht = new Hashtable();

Link curr = head;

while (curr != null)

{

if (curr.Next == null)

{

break;

}

if (ht[curr.Next.Data] != null)

{

curr.Next = curr.Next.Next;

}

else

{

ht[curr.Next.Data] = "";

}

curr = curr.Next;

}

return head;

}

结构化面试题本(样式)

使用时间:XXXX年XX月XX日 XXXXXXXXXX公开招聘人员 结构化面试题本

题本使用说明 一、本题本包含XX道题。考官根据题本所列题目对应试者进行面试。 二、每位应试者的面试时间为XX分钟。主考官应在每名应试者面试开始前,在应试者席为应试者准备好相应的题签,并告知应试者严禁在题签上勾画或写字。 三、面试前,考官要对试题和评分参考进行研讨,以加深对试题的理解。由于应试者回答问题具有开放性,评分参考只是提出了一些原则要求,考官要以此为参考,预测可能有的几种答法,进一步细化和统一评分标准。 四、本次面试主要考察应试者的六种能力要素,即:综合分析能力、计划组织协调能力、人际交往意识与技巧、应变能力、语言表达能力和举止仪表。其中:应变能力要素、语言表达能力要素和举止仪表要素不单独设题,考官可根据应试者的实际表现进行评分。 五、结构化面试成绩计算方法是:在各位考官的评分结果中去掉一个最高分和一个最低分,其余有效分的平均值为应试者的面试最后得分。 六、根据保密规定,此题本属绝密资料,不得复制留存。当面试结束后,全部题本、题签必须在纪检监察人员监督下当场统一销毁,并认真填写《面试题本、题签销毁记录单》。

第一个问题: 【出题思路】主要测查考生综合分析能力。 【评分参考】 好:考虑问题全面,思路清晰,思考问题具有一定的深度和广度,有独到的见解,能够注意整体和部分之间的相互联系及各部分之间的有机协调配合。语言表达流畅。 中:考虑问题比较全面,思路比较清晰,能够注意整体和部分之间的相互联系及各部分之间的有机协调配合。语言表达基本流畅。 差:考虑问题不够全面,思路不清晰,语言表达一般。 第二个问题: 【出题思路】主要测查考生的计划组织协调能力。 【评分参考】 好:考虑问题周到细致,思路清晰,计划安排有序,资源调配合理,能对冲突各方的利益根据一定的标准进行协调。语言表达流畅。

数据结构常见笔试题

1.栈和队列的共同特点是(只允许在端点处插入和删除元素) 2.栈通常采用的两种存储结构是(线性存储结构和链表存储结构) 3.链表不具有的特点是(B) A.不必事先估计存储空间 B.可随机访问任一元素 C.插入删除不需要移动元素 D.所需空间与线性表长度成正比 4.用链表表示线性表的优点是(便于插入和删除操作) 5.在单链表中,增加头结点的目的是(方便运算的实现) 6.循环链表的主要优点是(从表中任一结点出发都能访问到整个链表) 7.线性表若采用链式存储结构时,要求内存中可用存储单元的地址(D) A.必须是连续的 B.部分地址必须是连续的 C.一定是不连续的 D.连续不连续都可以 8.线性表的顺序存储结构和线性表的链式存储结构分别是(随机存取的存储结构、顺序存取的存储结构) 9.具有3个结点的二叉树有(5种形态) 10.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的 结点数为(13)(n 0 = n 2 +1) 11.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是(cedba) 12.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是(gdbehfca) 13.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。

1.在计算机中,算法是指(解题方案的准确而完整的描述) 2.算法一般都可以用哪几种控制结构组合而成(顺序、选择、循环) 3.算法的时间复杂度是指(算法执行过程中所需要的基本运算次数) 4.算法的空间复杂度是指(执行过程中所需要的存储空间) 5.算法分析的目的是(分析算法的效率以求改进) 6.下列叙述正确的是(C) A.算法的执行效率与数据的存储结构无关 B.算法的空间复杂度是指算法程序中指令(或语句)的条数 C.算法的有穷性是指算法必须能在执行有限个步骤之后终止 D.算法的时间复杂度是指执行算法程序所需要的时间 7.数据结构作为计算机的一门学科,主要研究数据的逻辑结构、对各种数据结构进行的运算,以及(数据的存储结构) 8.数据结构中,与所使用的计算机无关的是数据的(C) A.存储结构 B.物理结构 C.逻辑结构 D.物理和存储结构 9.下列叙述中,错误的是(B) A.数据的存储结构与数据处理的效率密切相关 B.数据的存储结构与数据处理的效率无关 C.数据的存储结构在计算机中所占的空间不一定是连续的 D.一种数据的逻辑结构可以有多种存储结构 10.数据的存储结构是指(数据的逻辑结构在计算机中的表示) 11.数据的逻辑结构是指(反映数据元素之间逻辑关系的数据结构) 12.根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为(线性结构和非线性结构) 13.下列数据结构具有记忆功能的是(C) A.队列 B.循环队列 C.栈 D.顺序表 14.递归算法一般需要利用(栈)实现。 15.由两个栈共享一个存储空间的好处是(节省存储空间,降低上溢发生的机率)

数据结构与算法复习题10(C语言版)

习 9解答 判断题: 1.用向量和单链表表示的有序表均可使用折半查找方法来提高查找速度。 答:FALSE (错。链表表示的有序表不能用折半查找法。) 2.有n 个数据放在一维数组A[1..n]中,在进行顺序查找时,这n 个数的排列有序或无序其平均查找长度不同。 答:FALSE (错。因顺序查找既适合于有序表也适合于无序表;对这两种表,若对于每个元素的查找概率相等,则顺序查找的ASL 相同,并且都是(n+1)/2;对于查找概率不同的情况,则按查找概率由大到小排序的无序表其ASL 要比有序表的ASL 小。) 3.折半查找是先确定待查有序表记录的范围,然后逐步缩小范围,直到找到或找不到该记录为止。( ) 答:TRUE 4.哈希表的查找效率主要取决于哈希表哈希表造表时选取的哈希函数和处理冲突的方法。 答:TRUE 5.查找表是由同一类型的数据元素(或记录)构成的集合。 答:TRUE 单选题: 6.对于18个元素的有序表采用二分(折半)查找,则查找A[3]的比较序列的下标为( )。 A. 1、2、3 B. 9、5、2、3 C. 9、5、3 D.9、4、2、3 答:D (第一次??2/)181(+ = 9,第二次??2/)81(+ = 4,第三次??2/)31(+ = 2, (第四次??2/)33(+ = 3,故选D. 7. 顺序查找法适合于存储结构为____________的线性表。 A.散列存储 B.顺序存储或链式存储 C.压缩存储 D.索引存储 答:B 8.对线性表进行二分查找时,要求线性表必须( )。 A .以顺序方式存储 B. 以链接方式存储 C .以顺序方式存储,且结点按关键字有序排序 D. 以链接方式存储,且结点按关键字有序排序 答:C 9.设哈希表长m=14,哈希函数为H(k) = k MOD 11。表中已有4个记录(如下图

力 扣 数 据 结 构 与 算 法

前端如何搞定数据结构与算法(先导篇) 「观感度:?」 「口味:锅包肉」 「烹饪时间:20min」 本文已收录在Github? 为什么要学习数据结构与算法? 在0202年的今天,由于每天被无数的信息轰炸,大多数人已经变得越来越浮躁了,并且丧失了独立思考的能力。 你可能会经常听到这样的感慨: 技术人究竟能走多远?我遇到了天花板 35岁的程序员要如何面对中年危机? 技术更新太快,好累,学不动了 然后,你也变得焦虑起来。那你有没有静下心来想过,如何才能抵御年龄增长并且使自己增值呢? 无非是终身学习,持续修炼自己的内功。内功也就是基础知识和核心概念,这些轰轰烈烈发展的技术本质,其实都是基础知识,也就是我们在大学里学过的基础课-程。 操作系统 计算机组成原理 计算机网络 编译原理

设计模式 数据结构与算法 这也就是为什么越靠谱的面试官越注重你基础知识的掌握程度,为什么越牛的的企业越重视你的算法能力。因为当你拥有了这些,你已经比大多数人优秀了。你的天花板由你自己来决定,大家口中的中年危机可能并不会成为你的危机。新技术来临时,你对它的本质会看得更加透彻,学起来会一通百通。这样的人才,公司培养你也会花费更少的成本。 (不过,一辈子做个开开心心的 CRUD Boy 也是一种选择。) 数据结构与算法之间的关系 Rob Pikes 5 Rules of Programming中的第五条是这样说的: Data dominates. If youve chosen the right data structures and organized things well, the algorithms will almost always be self-evident. Data structures, not algorithms, are central to programming. 数据占主导。如果您选择了正确的数据结构并组织得当,那么这些算法几乎总是不言而喻的。数据结构而非算法是编程的核心。 瑞士计算机科学家,Algol W,Modula,Oberon 和 Pascal 语言的设计师 Niklaus Emil Wirth 写过一本非常经典的书《Algorithms + Data Structures = Programs》,即算法 + 数据结构 = 程序。 我们可以得出结论,数据结构与算法之间是相辅相成的关系。数据结构服务于算法,算法作用于特定的数据结构之上。 数据结构与算法好难,怎么学?

结构化面试的题目本--最终问题详解

★绝密★ 结构化面试题本 题本使用说明 (考官必读) 一、本次面试每位应试者的面试时间为10分钟。面试时必须按题本排列顺序向应试者提问。 二、考官提问应尽量口语化,避免生硬念题。 三、每道题都附有评分参考。评分参考只是提出了一些原则要求,并不是标准答案。面试中考官可以此为参考,根据自己对各题的理解,对应试者的答题情况做出科学、客观、公正的评价,而不要拘泥于评分参考。 四、在主考提问前,试题签必须交给应试者。应试者答完题目后,保密员应立即收回题签,以备下位应试者使用。 五、言语表达能力、举止仪表、专业素养等测评要素可能不单独设题,考官应根据应试者回答问题时的实际表现综合考虑为应试者打分。 六、《结构化面试评分表》供考官使用,《结构化面试成绩汇总表》供统计成绩使用。 七、根据保密规定,此题本属绝密材料,私人不得留存。面试结束后,题本及各类评分表格由组织人事部门负责收回。

面试题 指导语 你好,今天的面试是希望通过我们的交谈,增进对你的了解。我们会问你三个问题,要求你谈谈自己的见解,面试时间为10分钟。回答每个问题前,你自己可先考虑一下,不必紧张。好,现在面试开始【提示:开始计时】 第一个问题 你对“凡是金子都会闪光”、“闪光的不一定是金子”这两句话怎么理解?有没有不会闪光的金子?为什么? 【出题思路】 智能性问题,考察应试者的综合分析能力 【观测要点】 1、透过现象把握实质的能力。 2、对问题分析透彻,条理清晰,阐述全面,论证合理。 3、有基本的理论素养。 【评分参考】 1、一个人的才能很重要,你拥有了才能你就会被人发现 2、闪光的不一定是金子,也有可能是钻石是玻璃,要准确的用人 3、有很多人才被埋没,没有发挥他的价值,以致于她是金子却不会闪光。平台 很重要,要主动去争取不能被动的发现 4、知晓自己的工作职责,金子在合适的领域发光就是金子,不是恰当的时间哪 怕发光也不是无用。

数据结构面试专题

数据结构面试专题 1、常用数据结构简介 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素间的关系组成。常用的数据有:数组、栈、队列、链表、树、图、堆、散列表。 1)数组:在内存中连续存储多个元素的结构。数组元素通过下标访问,下标从0开始。优点:访问速度快;缺点:数组大小固定后无法扩容,只能存储一种类型的数据,添加删除操作慢。适用场景:适用于需频繁查找,对存储空间要求不高,很少添加删除。 2)栈:一种特殊的线性表,只可以在栈顶操作,先进后出,从栈顶放入元素叫入栈,从栈顶取出元素叫出栈。应用场景:用于实现递归功能,如斐波那契数列。 3)队列:一种线性表,在列表一端添加元素,另一端取出,先进先出。使用场景:多线程阻塞队列管理中。 4)链表:物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域,一个是指向下一个结点地址的指针域。有单链表、双向链表、循环链表。优点:可以任意加减元素,不需要初始化容量,添加删除元素只需改变前后两个元素结点的指针域即可。缺点:因为含有大量指针域,固占用空间大,查找耗时。适用场景:数据量小,需频繁增加删除操作。 5)树:由n个有限节点组成一种具有层次关系的集合。二叉树(每个结点最多有两个子树,结点的度最大为2,左子树和右子树有顺序)、红黑树(HashMap底层源码)、B+树(mysql 的数据库索引结构) 6)散列表(哈希表):根据键值对来存储访问。 7)堆:堆中某个节点的值总是不大于或不小于其父节点的值,堆总是一棵完全二叉树。8)图:由结点的有穷集合V和边的集合E组成。 2、并发集合了解哪些? 1)并发List,包括Vector和CopyOnWriteArrayList是两个线程安全的List,Vector读写操作都用了同步,CopyOnWriteArrayList在写的时候会复制一个副本,对副本写,写完用副本替换原值,读时不需要同步。 2)并发Set,CopyOnWriteArraySet基于CopyOnWriteArrayList来实现的,不允许存在重复的对象。 3)并发Map,ConcurrentHashMap,内部实现了锁分离,get操作是无锁的。

数据结构和算法习题及答案解析

第1章绪论 习题 1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。 2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。 3.简述逻辑结构的四种基本关系并画出它们的关系图。 4.存储结构由哪两种基本的存储方法实现 5.选择题 (1)在数据结构中,从逻辑上可以把数据结构分成()。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 (2)与数据元素本身的形式、内容、相对位置、个数无关的是数据的()。 A.存储结构 B.存储实现 C.逻辑结构 D.运算实现 (3)通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着()。 A.数据具有同一特点 B.不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致 C.每个数据元素都一样 D.数据元素所包含的数据项的个数要相等 (4)以下说法正确的是()。 A.数据元素是数据的最小单位 B.数据项是数据的基本单位 C.数据结构是带有结构的各数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 (5)以下与数据的存储结构无关的术语是()。 A.顺序队列 B. 链表 C.有序表 D. 链栈 (6)以下数据结构中,()是非线性数据结构 A.树 B.字符串 C.队 D.栈 6.试分析下面各程序段的时间复杂度。 (1)x=90; y=100; while(y>0) if(x>100) {x=x-10;y--;} else x++; (2)for (i=0; i

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

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

结构化面试练习题本

结构化面试 一、自我认知与职业匹配 1、请你自我介绍一下 2、请谈谈你的优点和缺点 3、你有什么业余爱好? 4、请谈谈你的特长(硬件和软件) 5、谈谈你自己的个性特征,是否外向、内向,是否具有幽默感 6、谈你的家庭情况 7、座右铭 8、找工作考虑的重要因素(是否适合教师,喜欢这一岗位,帮助孩子更好的发展) 9、你对工资福利有什么期望(中等偏上,为什么能拿到这样的工资) 10、最尊敬的教育家 11、常看的教育教学类的书籍和杂志(课下积累) 12、教师职业的发展前途 13、未来十年的职业生涯 14、自我感觉得优势与不足 二、人际沟通 1、如何与不同类型的家长沟通,怎样的家校合作方式比较好 热情接待、认真倾听,努力理解 家长会、家访 2、学生偷钱,家长怪学校没有教育好 先平息怒火,认真倾听 询问孩子在家里的情况,与家长共同分析孩子偷钱的原因 提出共同努力的建议 3、教学不足,领导却将自己退为优秀教师 欣然接受,询问优势,接受不足 4、李某调皮,经常惹事生非,家长也不配合,作为班主任,如何处理 5、如何让不喜欢你的学生喜欢你 6、初一张某父母离异,远离同学,独来独往,不愿意参加集体活动。它的性格于有什么缺陷,如何帮助他? 三、组织管理 1、校长委托组织夏令营活动,如何开展 2、家长会的开展 3、如何组织好班会 4、如何开展好一次道德教育活动 理论结合实际,可换成体验课 四、综合分析 1、“授之以鱼,不如授之以渔“ 2、“以学生为本”或“以学生为主” 3、没有惩罚的教育是不完整的教育 从心理学的角度上来讲,惩罚是指给予,撤销某种刺激,以减少学生某一行为的发生频率 4、教师蜡烛说 5、“没有不合格的学生,只有不合格的老师” 6、班主任严格管理,教学生成绩优秀,一名学会说呢过因早恋导致成绩下滑,班主任生气,

经典数据结构面试题(含答案)

.栈通常采用的两种存储结构是______________________ .用链表表示线性表的优点是_______________________ 8.在单链表中,增加头结点的目的是___________________ 9.循环链表的主要优点是________________________- 12.线性表的顺序存储结构和线性表的链式存储结构分别是__________________________ 13.树是结点的集合,它的根结点数目是_____________________ 14.在深度为5的满二叉树中,叶子结点的个数为_______________ 15.具有3个结点的二叉树有(_____________________ 16.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为____________________ 17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是____________________________ 18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为______________________ 19.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是_______________________ 20.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。 在计算机中,算法是指_______________________ 算法一般都可以用哪几种控制结构组合而成_____________________ .算法的时间复杂度是指______________________ 5. 算法的空间复杂度是指__________________________ 6. 算法分析的目的是__________________________

数据结构与算法练习题

(说明:将答案写在试卷后面的答题纸上) 1.计算机识别、存储和加工处理的对象被统称为( ) A.数据 B.数据元素 C.数据结构 D.数据类型 2.在具有n个结点的有序单链表中插入一个新结点并使链表仍然有序的时间复杂度是 ( ) A.O(1) B.O(n) C.O(nlogn) D.O(n2) 3.队和栈的主要区别是( ) A.逻辑结构不同 B.存储结构不同 C.所包含的运算个数不同 D.限定插入和删除的位置不同 4.链栈与顺序栈相比,比较明显的优点是( ) A.插入操作更加方便 B.删除操作更加方便 C.不会出现下溢的情况 D.不会出现上溢的情况 5.下列说法中正确的是() A.二叉树中任何一个结点的度都为2 B.二叉树的度为2 C.任何一棵二叉树中至少有一个结点的度为2 D.一棵二叉树的度可以小于2 6.在一非空二叉树的中序遍历序列中,根结点的右边() A.只有右子树上的所有结点 B.只有右子树上的部分结点 C.只有左子树上的所有结点 D.只有左子树上的部分结点 7.在一个具有N个顶点的无向完全图中,包含的边的总数是() A.N(N-1)/2 B.N(N-1) C.N(N+1) D.N(N+1)/2 8.下面的程序在执行时,S语句共执行的()次。 i=1; while (i<=n) {for(j=i;j

10.已知一棵二叉树结点的先根序列为ABDGCFK,中根序列为DGBAFCK,则结点的后根序列为() A. ACFKBDG B. GDBFKCA C. KCFAGDB D. ABCDFKG 11.任何一个带权的无向连通图的最小生成树() A.只有一棵 B.有一棵或多棵 C.一定有多棵 D.可能不存在 12.已知某二叉树的后序遍历序列是dabec,中序遍历序列是debac,则它的前序遍历序列是() A. acbed B. decab C. deabc D. cedba 13.设深度为k的二叉树上只有度为0和度为2的结点,则这类二叉树上所含结点总数量是(C)个 A. k+1 B. 2k C. 2k-1 D. 2k+1 14.下面程序的时间复杂性是() For(i=1;i<=n;i++) For(j=1;j<=n;j++) {a[i][j]=i*j; } m) B. O(2n) C. O(m*n) D. O(m+n) A. O(2 15.含N个顶点的连通图中的任意一条简单路径,其长度不可能超过() A. 1 B. N/2 C. N-1 D. N 16. 下列说法正确的是(A) A.树的先根遍历序列与其对应的二叉树的先根遍历序列相同 B.树的先根遍历序列与其对应的二叉树的后根遍历序列相同 C.树的后根遍历序列与其对应的二叉树的先根遍历序列相同 D.树的后根遍历序列与其对应的二叉树的后根遍历序列相同 17.对于一个具有N个结点和E条边的无向图,若采用邻接表示,则表头向量的大小是(A) A. N B. N+1 C. N-E D. N-1 18.判断一个有向图是否存在回路,除了可以利用拓扑排序方法,还可以利用() A.求关键路径的方法 B.求最短路径的Dijkstra方法 C.广度优先遍历方法 D. 深度优先遍历方法 19.一个队列的输入序列是1,2,3,4,则队列的输出序列是() A,4,3,2,1 B.1,2,3,4 C.1,4,3,2 D.3,2,4,1 20.任何一个带权的无向连通图的最小生成树(B) C.一定有多棵 D.可能不存在 二、填空题(本大题共10小题,每小题1分,共10分) 请在每小题的空格中填上正确答案。错填、不填均无分。(1)在线性表中插入或删除一个元素,需要平均移动元素,具体移动的元素个数与有关。 (2)顺序表中逻辑上相邻的元素的物理位置紧邻,单链表中逻辑上相邻的元素物理位置紧邻。 (3)在单链表中,除了首元结点外,任意结点的存储位置由指示。 (4)记录的结构是数据在物理存储器上的存储方式。

阿里校园招聘历年经典面试题汇总:算法工程师

阿里校园招聘历年经典面试题汇总:算法工程师 (1)、jvm 原理 (2)、minor GC 与 Full GC (3)、HashMap 实现原理 (4)、java.util.concurrent 包下使用过哪些 (5)、concurrentMap 和 HashMap 区别 (6)、信号量是什么,怎么使用? (7)、阻塞队列了解吗?怎么使用? (8)、JAVA NIO 是什么? (9)、类加载机制是怎样的 (10)、什么是幂等性 (11)、有哪些 JVM 调优经验 (12)、分布式 CAP 了解吗? (13)、hdfs怎么添加Datanode,添加后hdfs会有什么操作? (14)、Hbase 跟关系数据库对比优缺点?为什么 Hbase 索引速度快 (15)、Hbase 大压缩与小压缩区别 (16)、Hive 与 Hbase 的使用场景 (17)、简单说说Spark功能,spark 与hive有无依赖关系? (18)、zookeeper 有什么应用场景,怎么选举的?3 个节点挂掉一个能正常工作吗? (19)、Hbase 中 zookeaper 作用 (20)、Hbase 写操作什么时候返回 (21)、mysql 有哪些存储引擎?各自特点 (22)、用过哪些设计模式?怎样实现线程安全单例模式? (23)、用过哪些RPC框架? (24)、什么是AOP? (25)、决策树算法怎么实现的? (26)、java垃圾回收会出现不可回收的对象吗?怎么解决内存泄露问题?怎么

定位问题源? (27)、终止线程有几种方式?终止线程标记变量为什么是 valotile 类型?(28)、用过哪些并发的数据结构? cyclicBarrier 什么功能?信号量作用?数据库读写阻塞怎么解决? (29)、乐观锁与悲观锁,怎么实现乐观锁? (30)、开发过分布式框架?怎么实现分布式事务? (31)、spark streaming与storm区别? (32)、找到最大子数组的 start,和end下标 (33)、用过 CDH中什么任务调度? (34)、spark streaming时间间隔设置很小会出现什么状况? (35)、搜索引擎了解多少?你认为搜索引擎的难点在哪里? (36)、RPC 了解吗?怎么监控 RPC 状态,找出出现问题的 RPC 连接?(37)、spring 框架了解多少? (38)、flume应用场景 (39)、找出一串字符中第一个不重复字符的下标。 点击查看详细面经〉〉〉〉〉〉〉〉〉〉〉〉 更多精品干货>>>>>>>>>>> 更多阿里机器学习/数据挖掘经典面试题 其他名企机器学习/数据挖掘经典面试题

最新结构化面试练习题

【结构化试题】 有些学校在计算班级成绩时,不把那些分数特别低的同学纳入统计名单,甚至有些老师还让这些同学的父母带他们去医院测智商。对学校的做法和教师的行为,你怎么看? 【参考答案】 学校不把分数特别低的同学纳入统计名单,部分教师让家长带学生去医院测智商的做法更是对学生人格的侮辱,会给学生带来严重的心理伤害,非常不利于学生的成长。 当前,很多学校过分关注学生的成绩,学生学习成绩的高低成为学校、家长以及社会评价他们成败得失的标准。在唯分数论的大背景下,一些学校为了提升自身品牌形象,吸引更多生源,所以不把分数低的学生纳入统计名单。这种行为一方面有违教育的宗旨,另一方面也伤害了成绩落后学生的自尊心,会导致青少年产生强烈的挫败感,不仅在学习上失去信心,也会对学校生活失去兴趣,甚至会让学生产生轻生的念头。 而有些老师的行为更为过分,让这些同学的父母带他们去医院测智商,严重违背了教师的基本职业素养,这一行为是必须受到谴责的。 学校是教书育人的地方,是孩子健康成长的摇篮。学校、教师、家长三方应该共同努力,为孩子的健康成长创造丰富的土壤。首先,要做好教书与育人的工作,学校必须进行教育改革,除了教出成绩的学生外,还要重视学生的个性化辅导,培育出德、智、体、美全面发展的学生。其次,教师作为人类灵魂的工程师,要践行“身正为师,学高为范”,展现高尚的道德情操,同时对学生的评价要多元化,更不能贬低和辱骂孩子。最后,家长应该多关心孩子,多和孩子进行思想上的交流,给孩子更多的鼓励,给孩子创造健康、温馨的成长环境。 【结构化试题】 “知之者不如好之者,好之者不如乐之者。”请谈谈你对这句话的理解。 【参考答案】 “知之者不如好之者,好之者不如乐之者”,意思是说,对于学习知识而言,知道怎么去学的人比不上爱好它的人,爱好它的人又不及以此为乐的人。孔子的这句话,说明了学习的三种境界——“知”“好”“乐”,更强调了兴趣在学习过程中的重要作用。 伟大的科学家爱因斯坦曾经说过:“兴趣是最好的老师。”一个人,一旦对某件事产生了浓厚的兴趣,就会主动地去求知、去探索、去实践,并在这个过程中获得愉快的体验。因此,古今中外的教育学家无不重视兴趣在智力开发中的重要作用。这就对教师的教学工作提出了更高的要求,即根据学生的个性化特点,激发学生的学习兴趣,并引导其将这种兴趣内化为不断开拓进取的驱动力,最大化地调动学生学习的积极性和主动性。 要想达到这一目标,我认为,可以从“培养”和“强化”两个方面着手。前者,是一个从无到有的过程。这就要求教师在教学过程中,要合理地设计课程,从学生接受的角度出

经典数据结构面试题(含答案)

栈和队列的共同特点是__________________________ .栈通常采用的两种存储结构是______________________ .用链表表示线性表的优点是_______________________ 8.在单链表中,增加头结点的目的是___________________ 9.循环链表的主要优点是________________________- 12.线性表的顺序存储结构和线性表的链式存储结构分别是 __________________________ 13.树是结点的集合,它的根结点数目是_____________________ 14.在深度为5的满二叉树中,叶子结点的个数为_______________ 15.具有3个结点的二叉树有(_____________________ 16.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为____________________ 17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是 ____________________________ 18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为______________________ 19.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是_______________________ 20.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。 在计算机中,算法是指_______________________ 算法一般都可以用哪几种控制结构组合而成_____________________ .算法的时间复杂度是指______________________ 5. 算法的空间复杂度是指__________________________ 6. 算法分析的目的是__________________________

数据结构选择题

选择一项: 1. 108 2. 110 3. 100 4. 120 2.在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是( b) 选择一项: a. 删除第i个结点(1≤i≤n) b. 访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n) c. 将n个结点从小到大排序 d. 在第i个结点后插入一个新结点(1≤i≤n) 3.以下说法错误的是( d)。 选择一项: a. 由于顺序存储要求连续的存储区域,所以在存储管理上不够灵活 b. 顺序存储的线性表可以随机存取 c. 求表长、定位这两种运算在采用顺序存储结构时实现的效率不比采用链式存储结构时实现的效率低 d. 线性表的链式存储结构优于顺序存储结构 4.单链表的存储密度( b)。 选择一项: a. 不能确定 b. 小于1 c. 大于1 d. 等于1 5.向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动的元素个数为( c)。 选择一项: a. 63 b. 7 c. d. 8 6.在一个长度为n的顺序表中,在第i个元素(1≤i≤n+1)之前插入一个新元素时须向后移动( b)个元素。 选择一项: a. n-i b. n-i+1 c. i d. n-i-1 7.在单链表中,要将s所指结点插入到p所指结点之后,其语句应为(a )。 选择一项: a. s->next=p->next; p->next=s; b. (*p).next=s; (*s).next=(*p).next; c. s->next=p->next; p->next=s->next;

d. s->next=p+1; p->next=s; 8.在双向循环链表中,在p指针所指的结点后插入q所指向的新结点,其修改指针的操作是(b )。 选择一项: a. p->next=q; q->prior=p; p->next->prior=q; q->next=q; b. q->prior=p; q->next=p->next; p->next->prior=q; p->next=q; c. p->next=q; p->next->prior=q; q->prior=p; q->next=p->next; d. q->prior=p; q->next=p->next; p->next=q; p->next->prior=q; 9.在双向链表存储结构中,删除p所指的结点时须修改指针(c )。 选择一项: a. p->prior=p->next->next; p->next=p->prior->prior; b. p->next=p->next->next; p->next->prior=p; c. p->next->prior=p->prior; p->prior->next=p->next; d. p->prior->next=p; p->prior=p->prior->prior; 10.将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是(c )。 选择一项: a. 2n b. n-1 c. n d. 2n-1 11.线性表L=(a1,a2,……an),下列说法正确的是( b)。 选择一项: a. 表中诸元素的排列必须是由小到大或由大到小 b. 除第一个和最后一个元素外,其余每个元素都有一个且仅有一个直接前驱和直接后继。 c. 每个元素都有一个直接前驱和一个直接后继 d. 线性表中至少有一个元素 12.线性表若采用链式存储结构时,要求内存中可用存储单元的地址(d )。 选择一项: a. 部分地址必须是连续的 b. 一定是不连续的 c. 必须是连续的 d. 连续或不连续都可以 13.线性表L在(d )情况下适用于使用链式结构实现。 选择一项: a. L中结点结构复杂 b. L中含有大量的结点 c. 需经常修改L中的结点值 d. 需不断对L进行删除插入 14.若指定有n个元素的向量,则建立一个有序单链表的时间复杂性的量级是( b)。 选择一项:

数据结构算法面试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、请你自我介绍一下 2、请谈谈你的优点和缺点。 3、你有什么业余爱好? 4、请你谈谈你的特长? 5.谈谈你自己的个性特征,是否外向,内向,是否有幽默感 6、谈你的家庭情况 7、你的座右铭是什么? 8、你找工作考虑的重要因素是什么? 9、你对工资和福利有什么期望? 10、你最尊敬的教育家是谁,为什么? 11、你常看的教育教学类的书籍和杂志有那些? 12. 你认为教师这个职业有发展前途吗? 13、请你规划未来十年的职业生涯? 14、即将要走上讲台的你,自我感觉对教师这一职业,最大的优势和最大的不足分别是什么? 二、人际沟通 1、如何与不同类型的家长沟通,怎样一种家校合作方式比较好? 2、一习惯很不好的学生偷了同学 300 元钱,偷钱学生的母亲跑到学校和老师吵架,说是学校没有教育好她的孩子,你应该怎么处理? 3、你教学中还存在很多不足,但学校领导把你推为优秀教师典型,对此你有什么看法? 4、学生李某比较调皮,经常惹是生非。对他的教育,学长也不不配合。作为班主任,你准备怎么办? 5、你用什么办法让不喜欢你的学生变的喜欢你? 6、初一学生张强由于父母离异,远离同学的交往圈子,喜欢独来独往,不愿意参加集体

活动。他的性格有什么缺陷?你将怎样帮他纠正? 三、组织管理 1、校长委托组织一次夏令营活动,你怎么开展工作? 2、如何开展好家长会? 3、如何组织好班会? 4、如何开展好一次道德教育活动? 四、综合分析 1、你对于“授之以鱼,不如授之以渔”这句话有什么理解? 2、现在常常提的“以学生为本”或“以学生为主体”,你怎样理解? 3、有人说没有惩罚的教育是不完整的教育?你怎么理解? 4、“老师是红蜡,照亮了别人,燃尽了自己”这句话,你是怎么理解的? 5、你同意“没有不合格的学生,只有不合格的教师”这句话吗? 6、一名班主任以严格管理著称,教学成绩优秀,一名女生因早恋,成绩大幅度下降,,班主任十分生气,在全班点名批评了这名女生,结果这位女生从教学楼跳楼自杀,你怎么看? 7、大雁南飞时,排成人字形,对此你有什么看法? 8、近年来,频频曝光高考舞弊现象,对此你有什么看法? 9、谈谈你对“有偿家教”的看法? 10、“学生自己管理自己”的观点你赞同吗? 11、你赞同“教学有法、但无定法、贵在得法”这种提法吗?为什么? 12、教学是一门技术还是一门艺术,你倾向那一种看法,若两者都不同意,请谈谈你的看法 13、现在有“贵族学校”、“贵族班”,对此有何评价? 14、请你谈谈在优越的环境(学校)和在相对更差的环境里哪个对孩子的成长更有利?为什么? 15、现在的孩子越来越自私了,你认为是这样吗?为什么? 16、小皇帝读书了,家庭中对孩子的教育发生过矛盾?作为教师对此你怎么看? 17、曾经轰动一时的马加爵事件引起全社会关于青少年心理健康的讨论。你对这种现象是怎样看的? 18、许多学校为什么强调学生穿校服,除了整齐外,还有别的意义吗?

算法大全-面试题-数据结构

一、单链表 目录 1.单链表反转 2.找出单链表的倒数第4个元素 3.找出单链表的中间元素 4.删除无头单链表的一个节点 5.两个不交叉的有序链表的合并 6.有个二级单链表,其中每个元素都含有一个指向一个单链表的指针。写程序把这个二级链表称一级单链表。 7.单链表交换任意两个元素(不包括表头) 8.判断单链表是否有环?如何找到环的“起始”点?如何知道环的长度? 9.判断两个单链表是否相交 10.两个单链表相交,计算相交点 11.用链表模拟大整数加法运算 12.单链表排序 13.删除单链表中重复的元素 首先写一个单链表的C#实现,这是我们的基石: public class Link { public Link Next; public string Data; public Link(Link next, string data) { this.Next = next; this.Data = data; } } 其中,我们需要人为地在单链表前面加一个空节点,称其为head。例如,一个单链表是1->2->5,如图所示: 对一个单链表的遍历如下所示: static void Main(string[] args) { Link head = GenerateLink(); Link curr = head; while (curr != null)

{ Console.WriteLine(curr.Data); curr = curr.Next; } } 1.单链表反转 这道题目有两种算法,既然是要反转,那么肯定是要破坏原有的数据结构的:算法1:我们需要额外的两个变量来存储当前节点curr的下一个节点next、再下一个节点nextnext: public static Link ReverseLink1(Link head) { Link curr = head.Next; Link next = null; Link nextnext = null; //if no elements or only one element exists if (curr == null || curr.Next == null) { return head; } //if more than one element while (curr.Next != null) { next = curr.Next; //1 nextnext = next.Next; //2 next.Next = head.Next; //3 head.Next = next; //4 curr.Next = nextnext; //5 } return head; } 算法的核心是while循环中的5句话 我们发现,curr始终指向第1个元素。 此外,出于编程的严谨性,还要考虑2种极特殊的情况:没有元素的单链表,以及只有一个元素的单链表,都是不需要反转的。

相关主题
文本预览
相关文档 最新文档