剑指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题目
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...
随机推荐
- noi.openjudge 二分法求函数的零点
二分法求函数的零点 总时间限制: 1000ms 内存限制: 65536kB 描述 有函数:f(x) = x5 - 15 * x4+ 85 * x3- 225 * x2+ 274 * x - 121 已 ...
- LUOGU P4113 [HEOI2012]采花
传送门 解题思路 莫队题卡莫队...莫队只能拿到100分,满分200.正解主席树??发个莫队100分代码. 代码 #include<iostream> #include<cstdio ...
- vue.js_04_vue.js的for循环,if判断和show显示
1.for循环 <body> <div id="app"> <p>{{list1[0]}}</p> <hr /> < ...
- 搭建nodejs代理服务器,从而解决跨域问题
先在同级处新建js文件(app.js) 使用时npm 安装 Node.js 模块语法 也就是对应的文件所在地“npm install”一下 然后安装对应需要的模块: expresspathreques ...
- 在skyline中将井盖、雨水箅子等部件放到地面模型上
公司三维建模组遇到这样的一个问题,怎样将井盖.雨水盖子恰好放在做好的地面模型上.传统的方法是在skyline中逐个调整井盖的对地高度,就是调整为恰好能放在地面上.或者选择很粗糙的一个方法,在“高度”属 ...
- PAT甲级——A1061 Dating
Sherlock Holmes received a note with some strange strings: Let's date! 3485djDkxh4hhGE 2984akDfkkkkg ...
- Python基础---三大推导式
推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据结构构建另一个新的数据结构的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...
- struts2-环境搭建-访问流程-配置详解-常量配置-类详解
1 struts2概述 1.1 概念 1.2 struts2使用优势 自动封装参数 参数校验 结果的处理(转发|重定向) 国际化 显示等待页面 表单的防止重复提交 struts2具有更加先进的架构以 ...
- 2019-7-15-win10-uwp-在笔迹开始书写拿到书写移动事件
title author date CreateTime categories win10 uwp 在笔迹开始书写拿到书写移动事件 lindexi 2019-7-15 8:58:5 +0800 201 ...
- Redis源码解析:28集群(四)手动故障转移、从节点迁移
一:手动故障转移 Redis集群支持手动故障转移.也就是向从节点发送"CLUSTER FAILOVER"命令,使其在主节点未下线的情况下,发起故障转移流程,升级为新的主节点,而原 ...