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. javascript的执行过程, 语法错误和运行时错误?

    js的执行错误分为 语法syntaxError,和 runtime error, 首先, js引擎会检查 整个脚本的语法, 如果在检查语法的过程中,发现了错误, 比如括哈不配对, 字符串少了 另一半的 ...

  2. SCU 4439 Vertex Cover(二分图最小覆盖点)题解

    题意:每一条边至少有一个端点要涂颜色,问最少涂几个点 思路:最小顶点覆盖:用最少的点,让每条边都至少和其中一个点关联,显然是道裸最小顶点覆盖题: 参考:二分图 代码: #include<iost ...

  3. js选择排序

    选择排序 平均时间复杂度O(n*n) 最好情况O(n*n) 最差情况O(n*n) 空间复杂度O(1) 稳定性:不稳定 function chooseSort (arr) { var temp; var ...

  4. linux网络流量实时监控工具之nload

    Install nload on a CentOS/RHEL/Red Hat/Fedora Linux First, turn on EPEL repo on a CentOS or RHEL bas ...

  5. js转义和反转义html

    本文地址: http://www.cnblogs.com/daysme/p/7100553.html 下面的代码网上常用有,但不是想要的. JS实现HTML标签转义及反转义 http://blog.c ...

  6. 一.移动app测试与质量保证

    1.典型的互联网产品的研发流程,及其核心做法.这里并不是简单的套用敏捷等流程方法,而是经过时间摸索和不断调整,找到最适合自己产品的流程做法,这是质量实践质量保证的基础. 2.系统功能测试实践.包涵需求 ...

  7. Java处理微信公众号文章图片不显示微信

    http://blog.csdn.net/just4you/article/details/52933620

  8. glfw3native.h and glfw3.h

    https://www.glfw.org/docs/latest/files.html

  9. ZZNU 2095 : 我只看看不写题

    把所有时间加起来,最后从大到小排序,一定要把大的先减去.注意花费的时间都是1,这一秒用过就不能再用了,所有用到了并查集的部分知识 #include<iostream> #include&l ...

  10. leecode第五十九题(螺旋矩阵 II)

    class Solution { public: vector<vector<int>> generateMatrix(int n) { )//特殊情况 { vector< ...