首页 > 编程知识 正文

数据结构面试常见问题,数据结构和算法笔试题

时间:2023-05-04 05:52:16 阅读:173266 作者:853

一数据结构1.你熟悉什么数据结构?

数组链表

堆栈队列散列

二叉树二叉搜索树二叉山

b树b树

2.b树 b+树 b*树

B和B两个节点都可以有很多子节点。 不同之处在于,b树中的所有节点都可以存储关键字,而b树中只有叶节点存储关键字,并且适合数据库索引。

3.树的中序遍历

4.二叉平衡树,怎么用一维数组存储

使用数组存储时,二叉树节点按层次顺序放置在数组中的相应位置。 如果某个节点左边的孩子或右边的孩子是空的,则数据的相应位置也是空的。

设计思路:

设父节点的下标为p

左孩子的下标=2p 1

右子代下标=2p 2

相反,左子下标是l,其父节点的下标是(l - 1 )/2

二算法1.快排?快排的实现过程?复杂度如何?简单代码实现?

方式:

双边循环法(代码实现复杂) )

单边循环法(推荐) ) ) ) ) ) )。

复杂度:

nlogn

单边循环法实现过程

1-首先找到基础元素,然后开始下标

2-导线,如果元素小于基准元素,则下标1

该元素与对应于下标的元素交换位置

3-遍历完成后,基准元素将与当前下标元素交换位置,并将基准元素分成两组数据

4-递归调用两侧的数据并进行拆分,在开始下标和结束下标结束之前无法拆分

5-遍历数组元素即可

单边循环法代码实现:

publicstaticvoidquicksort (int [ ] arr,int startIndex,int endIndex )//递归终止条件:如果startIndex大于或等于endIndex,则为if ) startindex=endex ////基于标准元素,分两部分递归地执行quicksort(ARR,startIndex,pivotIndex - 1 ); 快速索引(arr,pivotIndex 1,endIndex ); } /** *分治(单边循环法) * @param arr要交换的数组) * @param startIndex开始下标(* @param endIndex结束下标(/privatestaticintpartition ) int int聪明的白猫=startIndex; for(intI=startindex1; i=endIndex; I ) if(arr[I]pivot ) )聪明的白猫; int p=arr[聪明的白猫] arr[聪明的白猫]=arr[i]; arr[i]=p; }} arr[startIndex]=arr[聪明的白猫]; arr[聪明的白猫]=pivot; return聪明的白猫; } publicstaticvoidmain (string (args ) int ) arr=newint ) ) 4、4、6、5、3、2、8、1 ); 快速引导(arr,0,arr.length-1 ); system.out.println (arrays.tostring (arr ) ); }说明:

递归代码的书写特点,先找到一个循环的代码,在找出跳出循环的条件,递归的调用循环代码。

2.二分查找原理,简单的一个代码

算法思想:

设定开始位置start、结束位置end以及中间位置mid=(end start )/2,

如果arr[index]=mid,则返回mid

对于arr[index]mid,请从下半部分开始搜索,并将start设置为mid 1

对于arr[index]mid,请从下半部分开始搜索,并将end设置为mid-1

如果是startend,则返回-1,表示所检查的元素不存在

代码:

public class select1_ suan fa2 { publicstaticvoidmain (string [ ] args ) }

System.out.println(select(44));}public static int select(int target) {//定义数组int[] arr = {21,32,36,44,45,36,47,38,29};//定义初始位置int start = 0;//定义结束位置int end = arr.length-1;//定义中间位置int mid = (start+end)/2;while(true) {//如果没有这个元素,则start>=end,返回-1if(start>end) { return -1;}//判断是否和中间位置元素值相等if(arr[mid] == target) {//将中间位置的索引赋值给目标位置return mid;}else {if(arr[mid] > target) {//将end位置设置为中间位置减一end = mid-1;}else {//将start位置设置为中间位置加1start = mid+1;}//取出新的中间位置(别忘记了)mid = (start+end)/2;}}} }

3.怎么判断链表是否有环?

思路:
两个指针分别按照固定步长行走,P1一次走1布,P2一次走2布,如果链表有环,P1和P2会有相遇的时刻。(追击问题解法)

代码:

/** * 判断是否有环 * @param head 链表头节点 */ public static boolean isCycle(Node head) { Node p1 = head; Node p2 = head; while (p2!=null && p2.next!=null){ ; p1 = p1.next; p2 = p2.next.next; if(p1 == p2){ return true; } return false; } /** * 链表节点 */ private static class Node { int data; Node next;Node(int data) { this.data = data; } } public static void main(String[] args) throws Exception { Node node1 = new Node(5); Node node2 = new Node(3); Node node3 = new Node(7); Node node4 = new Node(2); Node node5 = new Node(6); node1.next = node2; node2.next = node3; node3.next = node4; node4.next = node5; node5.next = node2; System.out.println(isCycle(node1)); }

4.链表的定义,怎么实现链表翻转?
链表翻转代码参考: https://blog.csdn.net/xu491361421xiao/article/details/81385435

5.怎么求数组的最大子序列和

6.栈中最小值


代码如下:

private Stack<Integer> mainStack = new Stack<Integer>(); private Stack<Integer> minStack = new Stack<Integer>(); /** * 入栈操作 * @param element 入栈的元素 */ public void push(int element) { mainStack.push(element); //如果辅助栈为空,或者新元素小于或等于辅助栈栈顶,则将新元素压入辅助栈 if (minStack.empty() || element <= minStack.peek()) { minStack.push(element); } } /** * 出栈操作 */ public Integer pop() { //如果出栈元素和辅助栈栈顶元素值相等,辅助栈出栈 if (mainStack.peek().equals(minStack.peek())) { minStack.pop(); } return mainStack.pop(); } /** * 获取栈的最小元素 */ public int getMin() throws Exception { if (mainStack.empty()) { throw new Exception("stack is empty"); } return minStack.peek(); } public static void main(String[] args) throws Exception { MinStack stack = new MinStack(); stack.push(4); stack.push(9); stack.push(7); stack.push(3); stack.push(8); stack.push(5); System.out.println(stack.getMin()); stack.pop(); stack.pop(); stack.pop(); System.out.println(stack.getMin()); }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。