转自:https://blog.csdn.net/Together_CZ/article/details/74906427

1.面试7:使用两个栈实现一个队列。

//猛一看有点晕,实际上很简单。

使用两个栈,一个是保存输入S1,另一个是输出S2;

当有新元素插入到队尾时,就将元素放入S1中;

当要删除队头元素的时候,若S2不为空,那么就弹S2的首元素;否则将S1中全部出栈压入S2中,再弹出,如果S1为空,那么就没有元素了。

2.面试 13:在O(1)时间内删除链表节点

那么就找到一个结点指针的下一个节点,并将元素赋值,并且删除下一个节点,并将指针指向下下一个节点。

如果是删除最后一个节点,那么就需要遍历了。

3.面试26:复制复杂链表

节点结构定义:

public static class ComplexListNode {
int value;
ComplexListNode next;//指向下一个节点
ComplexListNode sibling;//有一个指向任意节点的指针。
}

//如果是使用普通复制的话,那么需要两个遍历的指针,并且时间复杂度是O(n^2)。

假设原始状态是这样的:

第一步:在每一个节点后面加上一个复制的节点;第二步,每一个复制节点的sibling指针,就指向签一个节点的sibling节点的下一个节点,第三步,奇偶拆分。

这个并不需要赋存,而且复杂度是O(n)的!!!

4.面试题27:二叉搜索树与双向链表

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

//猛一看都懵了啊!完全不会啊!

因为二叉树中的节点包括指向左子树和右子树的指针,而且双向链表中有指向前一个节点和后一个节点的指针,那么是可以实现转化的。

只要将当前根节点的左指针指向,左子树中最大的节点;右指针指向右子树中最小的节点即可。

那么递归地去进行,先将左子树转化为双链表,将根节点地左子节点指针指向最后一个节点;然后去处理右子树,将根的右子节点指向右子树的第一个节点。

5.面试30:最小的K个数

O(nlogk)的复杂度,使用最大堆来实现;

最大堆最多存储K个数,如果当前堆未满,那么就直接放进来,如果已经满了,那么就和堆定元素比较,如果比堆定元素小,那么就将堆顶元素替换,再调整堆;

如果比堆定元素大,那么肯定就不在这K个数中,其实可以用优先队列来实现啊。

6.面试题56:链表中环的入口结点

一个链表中包含环,如何找出环的入口结点?

//猛一看是不会的。

使用两个指针,那么P1和P2,先让P1走环中节点的长度n,然后两个指针以相同速度向前移动,第二个指针指向环入口的节点,那么第一个指针也已经到了环入口节点,二者相等。

那么如何求环中有多少个指针呢?使用快慢指针,如果两个指针相遇,那么表明链表中存在环,从相遇的节点出发,遍历一周边计数,当再次回到这个节点就可以得出环中节点个数了。

剑指offer-基本思想学习(未包括代码)的更多相关文章

  1. 剑指Offer——归并排序思想应用

    剑指Offer--归并排序思想应用 前言 在学习排序算法时,初识归并排序,从其代码量上感觉这个排序怎么这么难啊.其实归并排序的思想很简单:将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列 ...

  2. 剑指offer——树的子结构 (JAVA代码)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构). 解题思路: 首先看牛客网给出的测试用例: ...

  3. 剑指offer—第三章高质量代码(o(1)时间删除链表节点)

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue ...

  4. 剑指offer—第三章高质量代码(数值的整数次方)

    高质量的代码:容错处理能力,规范性,完整性.尽量展示代码的可扩展型和可维护性. 容错处理能力:特别的输入和处理,异常,资源回收. 规范性:清晰的书写,清晰的布局,合理的命名. 完整性:功能测试,边界测 ...

  5. 剑指offer—第三章高质量代码(合并两个排序链表)

    题目:输入员两个递增排序的链表,合并这两个链表并使新的链表中的结点仍然是按照递增排序的. 思路:首先,定义两个头节点分别为Head1和Head2的链表,然后比较第一个节点的值,如果是Head1-> ...

  6. 《剑指offer》全部题目-含Java实现

    1.二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. publi ...

  7. 剑指Offer:面试题14——调整数组顺序使奇数位于偶数前面(java实现)

    问题描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 思路: 1.最简单的想法,不考虑时间复杂度,扫描数组,遇到偶数,先取出这 ...

  8. 【剑指offer】扑克牌的顺子

    个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想測測自己的手气,看看能不能抽到顺子,假设抽到的话,他决定去买体育彩票,嘿嘿! ."红心A,黑桃3,小王,大王,方片 ...

  9. 【剑指offer】直扑克

    个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想測測自己的手气,看看能不能抽到顺子,假设抽到的话,他决定去买体育彩票,嘿嘿! ! "红心A,黑桃3,小王,大王,方 ...

随机推荐

  1. 多个 label checkbox 组合 显示在同一个水平线上[前提Bootstrap框架]

    <th align="left" valign="middle"> <label class="checkbox inline fo ...

  2. could not find com.android.support.appcompat-v7:23.4.0

    导入别人的工程到AS中,出现错误,是由于android studio的版本比所加载的工程所使用的版本低,有些包不是最新的. 我的android studio这个包的版本是 v7:23.1.1 所以需要 ...

  3. backbone.js初探(转)

    BackBone是JavaScript frameworks for creating MVC-like web applications,最近流行的用来建立单页面web application的工具 ...

  4. mysql -- 预处理语句

    所谓预处理,即在真正执行某条SQL语句之前,先将SQL语句准备好,在执行过程中再绑定数据 语法: 准备预处理 prepare 预处理名字 from ‘要执行的SQL语句’ 执行预处理 execute ...

  5. Java凝视模板

     设置凝视模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是全部需设置凝 ...

  6. 转载 HTTPS 之fiddler抓包、jmeter请求

    转载自 http://suixiang0923.github.io/2016/01/12/%E6%B5%85%E8%B0%88HTTPS%E4%BB%A5%E5%8F%8AFiddler%E6%8A% ...

  7. hdu 1174:爆头(计算几何,三维叉积求点到线的距离)

    爆头 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...

  8. Loadrunner_http长连接设置

    最近协助同事解决了几个问题,也对loadrunner的一些设置加深了理解,关键是更加知其所以然. ljonathan http://www.51testing.com/html/48/202848-2 ...

  9. 用公式编辑器编辑n元乘积的方法

    在数学中经常会出现很多个元素进行求和或者是乘积的情况,但是在整个数学过程中,不可能将所有的元素都写出来,这样很费时费力同时过程也很赘余,不能很好地理解其中的过程,因此数学中对于这一类的多元相加或者相乘 ...

  10. 项目期复习总结2:Table, DIV+CSS,标签嵌套规则

    文件夹: 1.表格的意义,含义? 2.表格有哪些元素? 3.表格布局,表格布局的优缺点 4.行元素,块元素的差别? 5.标签的合理嵌套及标签的语义性 ① 表格的意义,含义? 表格应该用来展现那些适合表 ...