《剑指offer》总结一

1、二维数组中的查找(223ms)
题目描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:
由于二维数组从左到右,从上到下都是有序依次增大,所以可以考虑,选取右上角或右下角。因为这两个位置有一个特点,都位于两边的数字中间。例如,右上角位置左侧都比其小,该位置下侧都比其大,因此挪动位置具有唯一性。左下角位置亦如此。
\(\color{green}{代码实现}\):二维数组的查找
2、替换空格(24ms)
题目描述:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:
从前往后替换,需要将空格后面所有字符的位置都后移两格,循环中嵌套判断和循环,时间复杂度为O(n*n);
从后往前替换,只需要提前计算字符串长度和空格的数目,每个空格使得字符串多出两个长度,然后逆序替换为新的字符串。具体过程为:
(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},则重建二叉树并返回。
前序遍历:根节点->左子树->右子树
中序遍历:左子树->根节点->右子树
后序遍历:左子树->右子树->根节点
思路:
在函数ConstructCore中,我们先根据前序遍历的第一个数字创建根结点,然后在中序遍历中找到根结点的位置,这样就能确定左右子树节点的数量。在前序遍历和中序遍历中划分了左、右子树节点的值之后,我们就可以递归地调用函数ConstructCore去分别构建它的左、右子树。
\(\color{green}{代码实现}\):重建二叉树
5、用两个栈实现队列
题目描述:
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
栈:常见的数据结构,后进先出,即最后被压入栈的元素会第一个被弹出。
队列:重要的数据结构,先进先出,即第一个进入队列的元素将会第一个出来。
思路:
假设两个栈为stackA和stackB。插入元素时,先将所有元素插入到stackA中,插入元素顺序为{1,2,3,4,5};
而当我们需要删除元素时,由于需要先删除1,因此,需要借助stackB,将stackA中的所有元素逐个弹出并压入stackB;
由于栈的结构是后入先出,因此这个时候栈B的元素依次为{5,4,3,2,1},即1变成了栈顶。然后我们让栈B中的所有元素依次弹出,就可以实现先入先出,即两个栈实现一个队列。
流程(删除一个元素):
当栈B不为空时,在stackB中的栈顶元素是最先进入队列的,因此可以弹出;
当栈B为空时,我们需要将stackA中的元素逐个弹出至stackB,然后再弹出stackB的栈顶元素。
\(\color{green}{代码实现}\):两个栈实现队列
参考:
- 《剑指offer》宝典神功
- 牛客网:https://www.nowcoder.com/ta/coding-interviews
《剑指offer》总结一的更多相关文章
- 剑指Offer面试题:1.实现Singleton模式
说来惭愧,自己在毕业之前就该好好看看<剑指Offer>这本书的,但是各种原因就是没看,也因此错过了很多机会,后悔莫及.但是后悔是没用的,现在趁还有余力,把这本书好好看一遍,并通过C#通通实 ...
- 剑指Offer面试题:14.链表的倒数第k个节点
PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...
- 《剑指offer》面试题12:打印1到最大的n位数
面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...
- 《剑指offer》面试题11: 数值的整数次方
面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...
- 剑指 Offer 题目汇总索引
剑指 Offer 总目录:(共50道大题) 1. 赋值运算符函数(或应说复制拷贝函数问题) 2. 实现 Singleton 模式 (C#) 3.二维数组中的查找 4.替换空格 ...
- 面试题目——《剑指Offer》
1.把一个字符串转换成整数——<剑指Offer>P29 2.求链表中的倒数第k个结点——<剑指Offer>P30 3.实现Singleton模式——<剑指Offer> ...
- 剑指offer习题集2
1.把数组排成最小的数 class Solution { public: static bool compare(const string& s1, const string& s2) ...
- 剑指offer习题集1
1.打印二叉树 程序很简单,但是其中犯了一个小错误,死活找不到,写代码要注意啊 这里左右子树,要注意是node->left,结果写成root->left vector<int> ...
- 剑指Offer:面试题20——顺时针打印矩阵(java实现)
题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数 字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, ...
- 牛客网上的剑指offer题目
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...
随机推荐
- 题解——ATCoder AtCoder Grand Contest 017 B - Moderate Differences(数学,构造)
题面 B - Moderate Differences Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Stat ...
- Awesome Torch
Awesome Torch This blog from: A curated list of awesome Torch tutorials, projects and communities. T ...
- Vue.extend构造器和$mount实例构造组件后可以用$destroy()进行卸载,$forceUpdate()进行更新,$nextTick()数据修改
html <div id="app"> </div> <p><button onclick="destroy()"&g ...
- Derek解读Bytom源码-Api Server接口服务
作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom ...
- Latex: 设置 threeparttable footnote 行宽度
参考: Table width with threeparttable smaller than notes and caption? Latex: 设置 threeparttable footnot ...
- 前端面试总结 (转 0C°)
前端面试总结 1.一些开放性题目 1.自我介绍:除了基本个人信息以外,面试官更想听的是你与众不同的地方和你的优势. 2.项目介绍 3.如何看待前端开发? 4.平时是如何学习前端开发的? 5.未来三到五 ...
- jdk1.8和tomcat9.0、maven3.5.0配置教程
一.jdk环境变量 JAVA_HOME :C:\Program Files\Java\jdk1.8.0_77(这个是你安装JDK时的路径,按照实际情况改成你自己的目录) CLASSPATH: .; ...
- 单域名下多子域名同时认证HTTPS
参考: http://blog.csdn.net/wzj0808/article/details/53401101 http://www.cnblogs.com/silin6/p/5931640.ht ...
- hdu 6070 Dirt Ratio 线段树+二分
Dirt Ratio Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Spe ...
- CPU核数和load average的关系
在前面的文章<Linux系统监控——top命令>中我简单提到了,判断load average的数值到底大不大的判断依据,就是数值除以CPU核数,大于5,就说明超负荷运转了.——这里其实不太 ...