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. org.springframework.jdbc.UncategorizedSQLException: Error attempting to get column 'alarmGroup' from result set. Cause: java.sql.SQLException: Error

    异常展示: org.springframework.jdbc.UncategorizedSQLException: Error attempting to get column 'alarmGroup ...

  2. error: could not create '/System/Library/Frameworks/Python.framework/Versions/2.7/share': Operation not permitted

    参考: Python pip安装模块报错 Mac升级到EI Captain之后pip install 无法使用问题 error: could not create '/System/Library/F ...

  3. Jquery Validate 相关参数

    Jquery Validate 相关参数 //定义中文消息 var cnmsg = { required: “必选字段”, remote: “请修正该字段”, email: “请输入正确格式的电子邮件 ...

  4. 【译】第13节---数据注解-Required

    原文:http://www.entityframeworktutorial.net/code-first/required-attribute-dataannotations-in-code-firs ...

  5. Java 基础功底

    Java 基础语法特性: 首先了解并做好Java Web 开发环境配置(包含 JDK 的配置)是非常必要的.其中 CLASSPATH 的值开始必须包含 ".",否则用 javac ...

  6. python Exception中的raise、assert

    使用raise抛出异常 当程序出现错误,python会自动引发异常,也可以通过raise显式地引发异常.一旦执行了raise语句,raise后面的语句将不能执行. 演示raise用法. try: s ...

  7. 【MySQL】【一】shell

    进入MySQL:mysql -u root -p 查看当前数据库下所有库:mysql> show databases; 切换到某库:mysql> use sys; 查看sys库下所有表:m ...

  8. _equipment

    该表控制切换地图自动更换装备,离开该地图时,装备自动切换为原来.,HEAD - TABARD小于0时取下装备,等于0时不更换,大于0时更换为对应装备. comment 备注 class 职业索引 1- ...

  9. P1230 智力大冲浪

    题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则: ...

  10. 关于System.in如何执行的问题

    import java.io.IOException; public class Test1 { public static void main(String[] args) throws IOExc ...