1、二维数组中的查找(223ms)

  • 题目描述:

    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

  • 思路:

    由于二维数组从左到右,从上到下都是有序依次增大,所以可以考虑,选取右上角或右下角。因为这两个位置有一个特点,都位于两边的数字中间。例如,右上角位置左侧都比其小,该位置下侧都比其大,因此挪动位置具有唯一性。左下角位置亦如此。

  • \(\color{green}{代码实现}\):二维数组的查找

2、替换空格(24ms)

  • 题目描述:

    请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

  • 思路:

    1. 从前往后替换,需要将空格后面所有字符的位置都后移两格,循环中嵌套判断和循环,时间复杂度为O(n*n);

    2. 从后往前替换,只需要提前计算字符串长度和空格的数目,每个空格使得字符串多出两个长度,然后逆序替换为新的字符串。具体过程为:

      (1) 首先输入一个字符串,然后计算字符串长度和空格的数目,每个空格使得字符串多出两个长度,从而计算出新的字符串长度;

      (2) 接着从后往前开始替换,第一个指针p1放在原字符串最后一个位置,第二个指针p2放在新字符串最后一个位置,同时向前移动,每当碰到空格的时候,指针p1向前移动1格,而指针p2向前移动3格,直到两个指针指向同一个位置,表明空格替换完毕,剩余字符一一替换即可。

  • \(\color{green}{代码实现}\):替换空格

3、从尾到头打印链表(22ms)

  • 题目描述:

    输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

  • 思路:

    这是最后一个节点先输出,属于典型的“后进先出”,可以用栈来实现,每经过一个节点,把该节点放入到一个栈中,到遍历完整个链表的时候,再从栈顶开始逐个输出节点的值。

  • \(\color{green}{代码实现}\):从尾到头打印链表

4、重建二叉树(37ms)

  • 题目描述:

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

    1. 前序遍历:根节点->左子树->右子树

    2. 中序遍历:左子树->根节点->右子树

    3. 后序遍历:左子树->右子树->根节点

  • 思路:

    在函数ConstructCore中,我们先根据前序遍历的第一个数字创建根结点,然后在中序遍历中找到根结点的位置,这样就能确定左右子树节点的数量。在前序遍历和中序遍历中划分了左、右子树节点的值之后,我们就可以递归地调用函数ConstructCore去分别构建它的左、右子树。

  • \(\color{green}{代码实现}\):重建二叉树

5、用两个栈实现队列

  • 题目描述:

    用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

    1. 栈:常见的数据结构,后进先出,即最后被压入栈的元素会第一个被弹出。

    2. 队列:重要的数据结构,先进先出,即第一个进入队列的元素将会第一个出来。

  • 思路:

    • 假设两个栈为stackA和stackB。插入元素时,先将所有元素插入到stackA中,插入元素顺序为{1,2,3,4,5};

    • 而当我们需要删除元素时,由于需要先删除1,因此,需要借助stackB,将stackA中的所有元素逐个弹出并压入stackB;

    • 由于栈的结构是后入先出,因此这个时候栈B的元素依次为{5,4,3,2,1},即1变成了栈顶。然后我们让栈B中的所有元素依次弹出,就可以实现先入先出,即两个栈实现一个队列。

  • 流程(删除一个元素):

    1. 当栈B不为空时,在stackB中的栈顶元素是最先进入队列的,因此可以弹出;

    2. 当栈B为空时,我们需要将stackA中的元素逐个弹出至stackB,然后再弹出stackB的栈顶元素。

  • \(\color{green}{代码实现}\):两个栈实现队列

参考

  1. 《剑指offer》宝典神功
  2. 牛客网:https://www.nowcoder.com/ta/coding-interviews

《剑指offer》总结一的更多相关文章

  1. 剑指Offer面试题:1.实现Singleton模式

    说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...

  2. 剑指Offer面试题:14.链表的倒数第k个节点

    PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...

  3. 《剑指offer》面试题12:打印1到最大的n位数

    面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...

  4. 《剑指offer》面试题11: 数值的整数次方

    面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...

  5. 剑指 Offer 题目汇总索引

    剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格              ...

  6. 面试题目——《剑指Offer》

    1.把一个字符串转换成整数——<剑指Offer>P29 2.求链表中的倒数第k个结点——<剑指Offer>P30 3.实现Singleton模式——<剑指Offer> ...

  7. 剑指offer习题集2

    1.把数组排成最小的数 class Solution { public: static bool compare(const string& s1, const string& s2) ...

  8. 剑指offer习题集1

    1.打印二叉树 程序很简单,但是其中犯了一个小错误,死活找不到,写代码要注意啊 这里左右子树,要注意是node->left,结果写成root->left vector<int> ...

  9. 剑指Offer:面试题20——顺时针打印矩阵(java实现)

    题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...

  10. 牛客网上的剑指offer题目

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

随机推荐

  1. P2147 [SDOI2008]洞穴勘测

    P2147 [SDOI2008]洞穴勘测 思路 没办法,我就是喜欢板子都想发的人 都是基础操作,不多说了 代码 #include <bits/stdc++.h> #define ls ch ...

  2. SpringBoot 使用validation数据校验

    后端对数据进行验证 添加包 hibernate-validator <!-- https://mvnrepository.com/artifact/org.hibernate.validator ...

  3. 【论文笔记】Learning Convolutional Neural Networks for Graphs

    Learning Convolutional Neural Networks for Graphs 2018-01-17  21:41:57 [Introduction] 这篇 paper 是发表在 ...

  4. 函数嵌套函数传递this值

    <button onclick="demo()(this)">test</button> function demo(){ return function ...

  5. 什么是mvc?

    MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型  (Model).视图(View)和控制器(Controller).      ...

  6. Bootstrap 3 媒体查询

    可以参考 Bootstrap  的媒体查询,写网站. html: <div class="bootstrap-3-media"> <p>Mobile-Fir ...

  7. 根据元素取两个list<T>不同

    var aa = ltB.FindAll(b => ltA.Any(a => a.PolicyNo == b.ID)); //得出不同 var expectedList = ltB.Exc ...

  8. @Autowired 警告 Field injection is not recommended Spring @Autowired注入

    问题: 一. 在IDEA升级2017版后,发现以前使用的 @Autowired 出现了个警告 Field injection is not recommended. @Autowired的三种使用方式 ...

  9. ros topic 发布一次可能会接收不到数据

    rostopic pub - /hdw_update hdw_driver/update_file_msg A B C D 系统提示: publishing and latching message ...

  10. centos7安装tomcat8 新手入门 图文教程

    系统环境 操作系统:64位CentOS Linux release 7.2.1511 (Core) JDK版本:1.8.0_121 下载tomcat8压缩包 访问官网:http://tomcat.ap ...