剑指offer 1-6
1. 二维数组中的查找
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int s1 = array.size(), s2 = array[].size();
int i = s1 - , j = ;
while (i >= && j < s2) {
if (array[i][j] == target) {
return true;
}
else if (array[i][j] > target) {
i--;
}
else {
j++;
}
}
return false;
}
};
本题还可采用其他分治策略,后续补充。
2. 替换空格
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
分析:
插入元素如果从前向后插入的话需要O(n^2)的时间复杂度,考虑先把空格个数算出,然后从后向前复制。
代码:
class Solution {
public:
void replaceSpace(char *str,int length) {
int blankSz = ;
for (int i = ; i < length; ++i) {
if (str[i] == ' ') {
blankSz ++;
}
}
int i = length - , j = length + * blankSz - ;
while (i >= ) {
if (str[i] != ' ') {
str[j] = str[i];
j--;
i--;
} else {
str[j] = '';
str[j - ] = '';
str[j - ] = '%';
i--;
j -= ;
}
}
}
};
3. 从尾到头打印链表
输入一个链表,从尾到头打印链表每个节点的值
分析:
方法1:利用一个栈,把元素以此压栈,然后弹栈倒序输出;
方法2:利用递归(本质利用了系统的栈)
代码:
//方法1
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
stack<int> st;
vector<int> result;
while (head != nullptr) {
st.push(head -> val);
head = head -> next;
}
while (!st.empty()) {
result.push_back(st.top());
st.pop();
}
return result;
}
}; //方法2
class Solution {
private:
vector<int> result;
public:
vector<int> printListFromTailToHead(ListNode* head) {
if (head != nullptr) {
printListFromTailToHead(head -> next);
result.push_back(head -> val);
}
return result;
}
};
4. 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
分析:
思路就是手动做二叉树恢复的思路,在中序遍历中找到根节点的位置,然后对左右子树各自递归。注意代码的写法,helper函数的参数设计(要传起始终止位置,不要拷贝vector)和传递(搞不清楚就举例子)即可。
代码:
class Solution {
private:
TreeNode* helper(const vector<int>& pre, int prevStart, int prevEnd, const vector<int>& vin, int vinStart, int vinEnd) {
if (prevStart == prevEnd) {
return nullptr;
}
if (prevEnd - prevStart == ) {
TreeNode* result = new TreeNode(pre[prevStart]);
return result;
}
int rootVal = pre[prevStart];
TreeNode* result = new TreeNode(rootVal);
int length = ;
for (int i = vinStart; i < vinEnd; ++i) {
if (vin[i] != rootVal) {
length++;
}
else {
break;
}
}
result -> left = helper(pre, prevStart + , prevStart + length + , vin, vinStart, vinStart + length);
result -> right = helper(pre, prevStart + length + , prevEnd, vin, vinStart + length + , vinEnd);
return result;
}
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
TreeNode* result = helper(pre, , pre.size(), vin, , vin.size());
return result;
}
};
5. 用两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
分析:
思路1 stack1用来push, stack2用来pop(),每次pop()完把数据倒回到stack1中,保证满足队列顺序,但效率比较低;
思路2 stack1用来push, stack2用来pop(), 每次pop()前判定stack2是否为空,如果为空则将stack1中元素均倒入stack2,然后再在stack2中pop(),不空直接pop()stack2
代码:
//方法1
class Solution
{
public:
void push(int node) {
stack1.push(node);
} int pop() {
while (!stack1.empty()) {
stack2.push(stack1.top());
stack1.pop();
}
int result = stack2.top();
stack2.pop();
while (!stack2.empty()) {
stack1.push(stack2.top());
stack2.pop();
}
return result; } private:
stack<int> stack1;
stack<int> stack2;
}; //方法2
class Solution
{
public:
void push(int node) {
stack1.push(node);
} int pop() {
if (stack2.empty()) {
while (!stack1.empty()) {
stack2.push(stack1.top());
stack1.pop();
}
}
int result = stack2.top();
stack2.pop();
return result; } private:
stack<int> stack1;
stack<int> stack2;
};
6. 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
分析:
思路1 二分搜索,用套路写就行,注意的是,其实由于更新start的条件只能在array[mid] > target时,start = mid,所以出循环后array[start]肯定不是解,可以不加那个判断;
思路2 可以用递归,注意分开两个区间的时候,有可能一个区间是非旋转的,所以递归终止条件是
if (rotateArray[] <= rotateArray[n - ]) {
return rotateArray[];
}
可以同时处理两种情况。
代码:
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int start = , end = rotateArray.size() - ;
while (start + < end) {
int mid = start + (end - start) / ;
if (rotateArray[mid] == rotateArray[]) {
start = mid;
}
else if (rotateArray[mid] < rotateArray[]) {
end = mid;
}
else {
start = mid;
}
}
return rotateArray[end];
}
};
剑指offer 1-6的更多相关文章
- 剑指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题目
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...
随机推荐
- XAMPP:继MAMP之后,Mac OS X平台下又一款帮你快速搭建服务器环境软件
之前,有很多人都有打算在自己的Mac OS下搭建一个本地测试用的Apache+PHP+MySQL网络服务器环境. 在目前而言至少有3种办法可以实现这一点: 通过Xcode开发者套件和php.Apach ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi代码---模式小结之一个叫声接口和几只鸭子[转]
一.一个叫声接口和几只鸭子 从一个叫声接口开始. {<HeadFirst设计模式>Delphi代码之模式小结 } { 一个叫声接口 } ...
- Error-SQLServer:【失败】win7装SQL server2017
ylbtech-Error-SQLServer:[失败]win7装SQL server2017 1.返回顶部 1. 2018年08月15日 22:06:38 USCWIFI 阅读数:5433 版 ...
- app-safeguard-record:record
ylbtech-work-app-safeguard-record:record 1.返回顶部 1. 示数 示数一般是指机械.仪器.仪表.或者需要对数字进行公开的显示的对外数字的宣示.比如电度表(千瓦 ...
- 转:PLL 锁相环
原地址:http://fangjian0518.blog.163.com/blog/static/559196562011210103455430/ PLL的作用? 答:LPC2000系列ARM内部 ...
- pycharm 安装与激活
---恢复内容开始--- 环境:Windows 专业版 1.下载安装 1.到官网下载专业版(专业版功能更全(但要激活码),社区版免费) 2.下载完后双击.exe 文件进行安装 NEXT 下一步 NEX ...
- WhaleCTF之web-http呀
WhaleCTF之web-http呀 前往题目 不多说,看看源码 源码没有,抓包,发一下,也没有 猜测不是这个页面 burp抓包,把html改成php 发一下,在返回源码看到flag~
- matlab保存数据
一:存txt文件,用dlmwrite()dlmwrite 将一个矩阵写到由分隔符分割的文件中. 在保存整数到文件时使用save存为ascii文件时,常常是文件里都是实型格式的数据(有小数点,和后面很多 ...
- springboot使用@Aspect实现AOP记录日志讲解
AOPAOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.在日常开发当中经常用来记录日志,方法跟踪 ...
- chgrp权限命令
功能说明:变更文件或目录的所属群组. 语 法:chgrp [-cfhRv][--help][--version][所属群组][文件或目录...] 或 chgrp [-cfhRv][--help][-- ...