[实战算法] 算法练习题汇总(总章)

版权声明:欢迎转载,转载请说明出处. 大数据Github项目地址https://github.com/SeanYanxml/bigdata。 https://blog.csdn.net/u010416101/article/details/88182693

前言

说来惭愧,工作2年多,对于算法方面是一点都没有进步。反而有点退步。本章意在重启当初的算法练习题. 看样子, 当初欠下的技术债还是要还.

练习地址: https://www.nowcoder.com/activity/oj
项目地址: https://github.com/SeanYanxml/arsenal/tree/master/arsenal-java/arsenal-algorithm


Offer Questions

《剑指offer》内面试算法题刷题总结。

  • 面试题1 - 实现=号赋值运算符

待续 Java实现

  • 面试题2 - 单例模式

建议懒汉模式 - 详见设计模式篇 设计模式之(二) 创建者模式
考察点: 单例模式

  • 面试题3 - 二维数组内的查找

考察点: 二维数组、找规律
com.yanxml.algorithm.offer.array.ArrayFind

  • 面试题4 - 替换空格

要点: 一次扫描需要替换的部分,不要每次都进行移位操作。
com.yanxml.algorithm.offer.stringStringReplaceSpace

  • 面试题5 - 从尾到头打印链表

思路1: 顺序插入 倒叙输出 (List) / 思路2: 栈结构 (Stack)
com.yanxml.algorithm.offer.linked.BackPrintLinkedNode

  • 面试题6 - 重建二叉树

思路: 递归调用
com.yanxml.algorithm.offer.tree.RebuildBinaryTree

  • 面试题7 - 用两个栈实现队列

思路: 一个栈存储,一个栈输出(要满足队列的先进先出 FIFO)
com.yanxml.algorithm.offer.stack.TwoQueueStack

  • 面试题8 - 旋转数组的最小数字

思路: 1 - 使用直接查找算法 2 - 使用二分查找算法(二分法的变体 特别注意中间值的判断)
com.yanxml.algorithm.offer.array.LeastNumberOfRotateArray

  • 面试题9 - 斐波拉契数列

思路: 1- 递归 2- 循环模拟递归的操作
com.yanxml.algorithm.offer.recursion.FibonacciTest

  • 面试题10 - 二进制中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

思路: 位运算 (正数/负数),特别注意(-1)的情况
com.yanxml.algorithm.offer.bit.CountOfNumberOne

  • 面试题11 - 数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

思路: 递归/非递归 (特别注意 0的指数 和 负数的指数 处理)
com.yanxml.algorithm.offer.bit.PowerOfNumber

  • 面试题12 - 打印1到最大的n位数

暂无

  • 面试题13 - 在O(1)时间删除链表结点

思路: 保存待删除结点的头和尾,将头和尾相连即可.
暂无

  • 面试题14 - 调整数组顺序使奇数位于偶数前面

题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

思路: 1- 排序 注意稳定性 (快速排序思路 不稳定!)2- 扩展排序条件接口 3 - 使用辅助空间
com.yanxml.algorithm.offer.array.OddBeforeEvenAfter

  • 面试题15 - 链表中倒数第K个结点

题目描述 输入一个链表,输出该链表中倒数第k个结点。

思路: 使用两个指针,指针2后指针1K步之后进行前进.

注意点:1. k不能大于链表的长度; 2. 只能遍历一次链表.
com.yanxml.algorithm.offer.linked.BackNumLinkNode

  • 面试题16 - 反转链表

题目描述 输入一个链表,反转链表后,输出新链表的表头。

思路: 使用3个指针:指针1(指向前指针);指针2(指向当前结点);指针3(指向下一个结点)

注意点: 注意临界值的情况;注意第一个结点和最后一个结点的情况.
com.yanxml.algorithm.offer.linked.ReverseLinkedList

  • 面试题17 - 合并两个排序的链表

题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

思路: 依次比较两个链表的表头,选择最小的一方加入新链表尾.
com.yanxml.algorithm.offer.linked.MergeTwoLinkedList

  • 面试题18 - 树的子结构

题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

思路: 不断迭代即可,典型递归思路(匹配到第一个结点后,将其分离开来)

com.yanxml.algorithm.offer.tree.SubTreeOrNot

  • 面试题19 - 二叉树的镜像

题目描述: 操作给定的二叉树,将其变换为源二叉树的镜像。

思路: 典型的递归思路(从根结点不断迭代即可)

注意点: 如果不想更改原有数据结构,需要拷贝新树.

com.yanxml.algorithm.offer.tree.MirrorTree

  • 面试题20 - 顺时针打印矩阵

  • 面试题21 - 包含min函数的栈

题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

思路: 使用两个栈,一个用来存值,一个用于辅助最小函数的实现

注意点: 栈的压入和弹出时,辅助栈也需要进行相应的操作.

com.yanxml.algorithm.offer.stack.MinStack

  • 面试题22 - 栈的压入、弹出序列

思路:模拟压栈、出栈操作

注意点: 注意循环停止条件

com.yanxml.algorithm.offer.stack.StackSequenceOrNot

  • 面试题23 - 从上往下打印二叉树

题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。

思路: 二叉树的层次遍历

注意点: 使用队列作为辅助的空间.(需要熟悉下Queue的数据结构 Java内通过LinkedList实现.)

com.yanxml.algorithm.offer.tree.LevelPrintTree

  • 面试题24 - 二叉搜索树的后续遍历系列

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

思路: 规律(后续遍历 左子树-右子树-根结点) 数组的最后一个数字为二叉树的根结点;循环遍历(递归)

com.yanxml.algorithm.offer.tree.VerifySquenceOfBST

  • 面试题25 - 二叉树中和为某一值的路径

题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

思路: 递归遍历 + 回溯

com.yanxml.algorithm.offer.tree.FindPathNumber

  • 面试题26 - 复制链表的复制

题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

思路: 方法1 巧用规律 方法2 使用HashMap

注意: 难点主要在于复制后的结点如何指向复制后的目标结点.(1-2-3 1’-2‘-3‘)

com.yanxml.algorithm.offer.linked.CopyComplexLinkedList

  • 面试题27 - 二叉搜索树与双向链表

题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

思路: 递归

com.yanxml.algorithm.offer.tree.SearchTreeToLinkedList

  • 面试题28 - 字符串的排列

题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

注意: 1. 注意去重 2. 注意结果排列 3.注意 输入(“aa” 将其看作"a1 a2",是两个不同的字母)

com.yanxml.algorithm.offer.string.PermutationString

  • 面试题29 - 数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

思路: 方法1- 快排思路 方法2- 使用辅助空间(HashMap)

注意: 数字不满一半的情况,另外注意奇数个数的一半和偶数个数的一半.

com.yanxml.algorithm.offer.array.MoreThanHalfOfArray

  • 面试题30 - 二进制中1的个数

题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

思路: 方法1- 快排思路 方法2- 使用辅助空间(最小堆O(N*log2N))

com.yanxml.algorithm.offer.array.SomeLeastNumberOfArray

  • To be continued.

题目类型划分

– To be continued.

猜你喜欢

转载自blog.csdn.net/u010416101/article/details/88182693