21.输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.empty()) return true; //空时,为真
int n = pushV.size();
stack<int> stack;
int k = ; //指向popv
for(int i=;i<n;i++){
if(pushV[i] == popV[k]){
k++;
}else{
stack.push(pushV[i]);
}
}
while(!stack.empty()){
if(stack.top() == popV[k]){
stack.pop();
k++;
}else{
break;
}
}
if(stack.empty()) return true;
else return false;
}
};

22.从上往下打印出二叉树的每个节点,同层节点从左至右打印。

/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> res;
if (root == nullptr) return res;
queue<TreeNode*> q1;
queue<TreeNode*> q2; q1.push(root);
while (!q1.empty()) {
while (!q1.empty()) {
TreeNode* p = q1.front();
if (p->left)
q2.push(p->left);
if (p->right)
q2.push(p->right);
res.push_back(p->val);
q1.pop();
}
swap(q1,q2);
}
return res;
}
};

23.输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

class Solution {
private:
bool doVerifySequenceOfBST(vector<int>& sequence) {
int n = sequence.size();
if(sequence.empty()) return true; vector<int> left;
vector<int> right;
int rootVal = sequence[n-];
for(int i=;i<n-;i++){
if(sequence[i] <= rootVal){
left.push_back(sequence[i]);
}else{
break;
}
}
int leftSize = left.size();
for(int i=leftSize;i<n-;i++){
if(sequence[i]>=rootVal){
right.push_back(sequence[i]);
}else{
break;
}
}
if(leftSize + right.size() != sequence.size() - ) return false;
return doVerifySequenceOfBST(left) && doVerifySequenceOfBST(right);
}
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int n = sequence.size();
if(sequence.empty()) return false;
return doVerifySequenceOfBST(sequence);
}
};

24.输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

class Solution {
private:
void doFindPath(TreeNode* root, int expectNumber, int sum,
vector<int> path, vector<vector<int>>& res) {
if (root == nullptr) return; path.push_back(root->val);
sum = sum + root->val;
if(sum == expectNumber && !root->left && !root->right){
res.push_back(path);
return;
}
if(sum > expectNumber) return;
doFindPath(root->left, expectNumber, sum, path, res);
doFindPath(root->right, expectNumber, sum, path, res);
}
public:
vector<vector<int>> FindPath(TreeNode* root, int expectNumber) {
vector<vector<int>> res;
vector<int> path;
doFindPath(root, expectNumber, , path, res);
return res;
}
};

25.输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead) {
if (pHead == nullptr) return nullptr;
//copy on the next
RandomListNode* p = pHead;
while (p) {
RandomListNode* q = new RandomListNode(p->label);
q->next = p->next;
q->random = nullptr;
p->next = q;
p = q->next;
}
//deal random pointer
p = pHead;
while (p) {
if (p->random) {
p->next->random = p->random->next;
}
p = p->next->next;
}
//split two list
p = pHead;
RandomListNode *head = p->next;
RandomListNode *q = head;
while (p) {
p->next = q->next;
p = p->next;
if (p) {
q->next = p->next;
q = q->next;
}
}
return head;
}
};

剑指offer(21-25)编程题的更多相关文章

  1. 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

    剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Offer 21 这题的解法其实是考察快慢指针和头尾指针. package com.walegarrett.offer; /** * @Aut ...

  2. 剑指offer计划25(模拟中等)---java

    1.1.题目1 剑指 Offer 29. 顺时针打印矩阵 1.2.解法 常规开头,先判断特殊情况,然后创建四个变量存放矩阵四边的长度限制. 创建res数组存放结果. 循坏开始,遍历完一行或者一列,就将 ...

  3. 【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇 ...

  4. 【剑指Offer】俯视50题之21 - 30题

    面试题21包括min函数的栈  面试题22栈的压入.弹出序列  面试题23从上往下打印二叉树  面试题24二叉搜索树的后序遍历序列  面试题25二叉树中和为某一值的路径  面试题26复杂链表的复制  ...

  5. 剑指offer 面试25题

    面试25题:题目:合并两个排序的链表 题:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题思路:递归,并需注意对空链表单独处理. 解题代码: # -* ...

  6. [持久更新] 剑指offer题目Python做题记录

    第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...

  7. 【剑指Offer】25、复杂链表的复制

      题目描述:   输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节 ...

  8. 剑指offer(25)复杂链表的复制

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...

  9. 《剑指offer》第二十一题(调整数组顺序使奇数位于偶数前面)

    // 面试题21:调整数组顺序使奇数位于偶数前面 // 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有 // 奇数位于数组的前半部分,所有偶数位于数组的后半部分. #inclu ...

  10. 《剑指offer》第十三题(机器人的运动范围)

    // 面试题:机器人的运动范围 // 题目:地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动,它 // 每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和 // ...

随机推荐

  1. 作业一:博客和Github简单练习

    (1)自我介绍 Hello everybody! 我叫纪杨阳,学号1413042002,网络工程141班. 本人没啥特殊的兴趣爱好,都是些平常得不能再平常的吃吃睡睡.要说感兴趣的,可能就是音乐和服饰还 ...

  2. Lucene索引的【增、删、改、查】

    前言 搞检索的,应该多少都会了解Lucene一些,它开源而且简单上手,官方API足够编写些小DEMO.并且根据倒排索引,实现快速检索.本文就简单的实现增量添加索引,删除索引,通过关键字查询,以及更新索 ...

  3. django设置cookie和session

    1 设置cookie 本例中应用名称为cookie 模型model from django.db import models from django.db import models class Us ...

  4. Selenium WebDriver之JavaScript

    WebDriver提供了方法来同步/异步执行JavaScript代码,这是因为JavaScript可以完成一些WebDriver本身所不能完成的功能,从而让WebDriver更加灵活和强大. 本文中所 ...

  5. 溢出文本省略号表示的css实现及polyfill

    需求经常有需要对文字溢出进行处理,通常是在文字显示部分的末尾添加“...”等.如下:

  6. WPF透明窗体不支持缩放解决方案

    方案一 WPF中的无边框透明窗体,由于没有边并且透明,窗体无法进行缩放操作,今天来讲解如何解决这个问题. 先说一下思路,我们先手为该窗体添加4个边,4个角用于缩放操作,然后再为他们写事件,完成拖放操作 ...

  7. [uwp]ImageSource和byte[]相互转换

    最近做一个小app遇到一个问题,到目前还没有比较好的解决方法(可能是我查的资料不够多) 需求如下: 1.把一个Image中的图像保存到字节数组: 2.把字节数组转换为ImageSource,通过Ima ...

  8. ELK学习链接

    1.  ELK原理与介绍 2. ELK部署记录

  9. linux网络流量实时监控工具之iptraf 【个人比较喜欢用的流量监控软件】

    linux网络流量实时监控工具之iptraf IPTraf是一个网络监控工具,功能比nload更强大,可以监控所有的流量,IP流量,按协议分的流量,还可以设置过滤器等,如下图 对监控网络来说,这个更适 ...

  10. 细化Azure RBAC权限

    Azure RBAC权限的细化一直是比较繁琐的事情,以下示例抛砖引玉,供大家参考 客户需求: 新用户在指定资源组下权限需求如下: 一.禁止以下权限 1. 调整虚拟机大小配置 2. 删除&停止虚 ...