剑指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题目
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...
随机推荐
- 廖雪峰Java9正则表达式-2正则表达式进阶-5非贪婪匹配
1.贪婪匹配 问题:给定一个字符串表示的数字,判断该数字末尾0的个数? "123000": 3个0 "10100": 2个0 "1001": ...
- select有条件in要按照in中的数据排序
mybatis中的写法 <select id="selectByIds" resultType="com.hoohui.electronic.util.ExHash ...
- Django项目:CRM(客户关系管理系统)--60--50PerfectCRM实现CRM客户报名流程学生合同URL随机码
# sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...
- 19-10-17-T
真的T了.(滑稽 Final 35 Miemeng 100 03:12:51 0 03:12:54 15 03:12:55 115 03:12:55 幸好$T1$还能要,不然就…… 前言 中午$\sc ...
- 局部内部类为什么只能访问final局部变量,对于成员变量却可以随便访问?
局部内部类为什么只能访问final局部变量,对于成员变量却可以随便访问? public class OuterClass { private int memberField = 10; public ...
- CentOS 6.5 FTP安装配置
安装配置 rpm -q vsftpd #检查是否安装了FTP yum -y install vsftpd #安装FTP chkconfig vsftpd on #设置开机启动 service vsft ...
- Linux Shell脚本经典案例
开头加解释器:#!/bin/bash 语法缩进,使用四个空格:多加注释说明. 命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 默认变量是全局的,在函数中变量 ...
- LA2965 Jurassic Remains
Jurassic Remains https://vjudge.net/problem/UVALive-2965 Paleontologists in Siberia have recently fo ...
- Leetcode429.N-ary Tree Level Order TraversalN叉树的层序遍历
给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右,逐层遍历). 例如,给定一个 3叉树 : 返回其层序遍历: [ [1], [3,2,4], [5,6] ] 说明: 树的深度不会超过 100 ...
- [Array] 561. Array Partition I
Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1 ...