文章目录

  • 目录
    • 第11题:
      • 解题思路:
      • 代码实现:
        • c++
        • python
    • 第12题:
      • 解题思路:
      • 代码实现:
        • c++
        • python
    • 第13 题:
      • 解题思路:
      • 代码实现:
        • c++
        • python
    • 第 14题:
      • 解题思路:
      • 代码实现:
        • c++
        • python
    • 第15 题:
      • 解题思路:
      • 代码实现:
        • c++
          • 递归实现
        • python
    • 第16 题:
      • 解题思路:
      • 代码实现:
        • c++
        • python
    • 第17题:
      • 解题思路:
      • 代码实现:
        • c++
          • 递归实现
        • python
    • 第18题:
      • 解题思路:
      • 代码实现:
        • c++
        • python
    • 第19题:
      • 解题思路:
      • 代码实现:
        • c++
        • python
    • 第20 题:
      • 解题思路:
      • 代码实现:
        • c++
        • python

目录

第11题:

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

解题思路:

  • 这道题非常简单,但是存在陷阱,即当exponent为负数和0的时候要特别考虑,其余的没有了

代码实现:

c++

#include <iostream>
#include <vector>
#include <cmath>using namespace std;double Power(double base, int exponent) {double temp = base;if(exponent < 0 ){for(int i =1 ;i<-(exponent);i++){temp *= base;}return 1.0/temp;}else if(exponent ==0){return 1;}else{for(int i = 1 ; i<exponent ; i++){temp *= base;}return temp;}}int main(){cout<<Power(2,-3)<<endl;cout<<Power(2,0)<<endl;cout<<Power(2,2)<<endl;return 0;
}

运行时间:5ms

占用内存:456k

python

# -*- coding:utf-8 -*-
class Solution:def Power(self, base, exponent):# write code herereturn base**exponent

运行时间:22ms
占用内存:5624k

第12题:

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

解题思路:

  • 通过使用2个栈结果来保存奇数项和偶数项,然后对数组从后向前遍历,遇到奇数就压奇数栈,遇到偶数就压偶数栈,然后在依次弹出奇数栈和偶数栈中的内容,并保存在原始的数组中(先将原始数组清空)

代码实现:

c++

#include <stack>
class Solution {public:void reOrderArray(vector<int> &array) {stack<int> oddStack;//定义奇数栈stack<int> evenStack;//定义偶数栈for(int i = array.size()-1 ; i >= 0 ;i--){if(array[i] % 2 == 0){evenStack.push(array[i]);}else{oddStack.push(array[i]);}}array.clear();while(!oddStack.empty()){array.push_back(oddStack.top());oddStack.pop();}while(!evenStack.empty()){array.push_back(evenStack.top());evenStack.pop();} }
};

运行时间:5ms

占用内存:480k

python

# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
class Solution:def reOrderArray(self, array):# write code hereoddList = []  #保存奇数evenList = []  #保存偶数for i in array:if i % 2 == 0:evenList.append(i)else:oddList.append(i)array = []for i in oddList:array.append(i)for i in evenList:array.append(i)return array

运行时间:23ms

占用内存:5724k

第13 题:

输入一个链表,输出该链表中倒数第k个结点。

解题思路:

  • 首先顺序遍历一遍链表,并将值压栈,然后在通过栈弹出第K个元素即为链表的倒数第K个元素。时间复杂度为O(n),空间复杂度为O(n);

代码实现:

c++

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution {public:ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {stack<ListNode*> tempStack;if(pListHead == NULL){return NULL;}if(k <= 0){return NULL;}int dataCount = 0;while (pListHead != NULL){tempStack.push(pListHead);pListHead = pListHead->next;dataCount++;}if(dataCount < k){return NULL;}for(int i = 0 ; i < k - 1 ; i++){tempStack.pop();}return tempStack.top();}
};

运行时间:4ms

占用内存:476k

python

# -*- coding:utf-8 -*-
class Solution:def FindKthToTail(self, head, k):# write code hereres=[]while head:res.append(head)head=head.nextif k>len(res) or k<1:returnreturn res[-k]

运行时间:26ms
占用内存:5732k

第 14题:

输入一个链表,反转链表后,输出新链表的表头。

解题思路:

  • 本体的意思应该是输出原始链表的反转链表,而不是仅仅只是输出反转后链表的头结点,所以通过栈的结构实现不佳。思想是:从头到尾遍历链表,然后将每两个节点进行反转操作即可,最好将原始的头结点的后继置NULL,头结点直接取最后一个元素

代码实现:

c++

class Solution {public:ListNode* ReverseList(ListNode* pListHead) {if(pListHead == NULL)return NULL;ListNode *pCurrent ,*pPre,*pNext;//一、指针的初始化阶段pPre = pListHead;pCurrent = pPre->next ;while(pCurrent)               //二、反转单链表的核心代码{pNext = pCurrent->next ;   //1. 缓冲pCurrent后面的单链表pCurrent->next = pPre ;       //2. 反转单链表pPre = pCurrent;           //3.让pPre指针后移pCurrent = pNext ;         //4. 让pCurrent指针后移}//三、处理并返回头指针pListHead->next = NULL;                //把原头结点的next域变成空指针pListHead = pPre ;                  //把头结点指向最后一个结点产生新的头结点,也就是把原单链表的尾结点变成头结点return pListHead;}
};

运行时间:5ms

占用内存:464k

python

# -*- coding:utf-8 -*-

第15 题:

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

解题思路:

  • 递归的方法:依次在链表1和链表2遍历,每次取两个链表中较小的那个值插入到新的链表中去。

代码实现:

c++

递归实现
class Solution {public:ListNode* Merge(ListNode* pHead1, ListNode* pHead2){if(pHead1 == NULL && pHead2 == NULL){return NULL;}if(pHead1 == NULL){return pHead2;}if(pHead2 == NULL){return pHead1;}ListNode* head;  //新链表的表头if(pHead1->val < pHead2->val){head = pHead1;head->next =  Merge(pHead1->next , pHead2); //递归调用}else{head = pHead2;head->next =  Merge(pHead1, pHead2->next);}return head;}
};

运行时间:4ms

占用内存:492k

python

# -*- coding:utf-8 -*-

第16 题:

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

解题思路:

  • 找一颗树是否为另外一颗树的子树,当然是遍历主树,先从根节点开始,如果根节点相同,就比较左右孩子节点,如果相同,则返回true,否则就递归遍历主树的左子树和右子树,只要找到一个相同即可。在比较子树和主树之前,我们要定义一个函数用于比较两个二叉树是否相同。也是从根节点开始,依次对比根节点,左孩子,右孩子是否相同,只有全部节点相同才是相同。

代码实现:

c++

class Solution {public:bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){if(!pRoot1 || !pRoot2) return false;bool result=false;if(pRoot1->val == pRoot2->val)result=isSubtree(pRoot1,pRoot2); // 找到判断子树if(!result) result=HasSubtree(pRoot1->left,pRoot2); // 未找到匹配的根节点以及匹配的子树,则继续向下递归if(!result) result=HasSubtree(pRoot1->right,pRoot2);return result;}//判断2棵树是否相同bool isSubtree(TreeNode* pRoot1, TreeNode* pRoot2){if(!pRoot2) return true; // 子树遍历完成(关键语句)if(!pRoot1) return false; // 主树异常时的输出(关键语句:提高鲁棒性)bool result=true;if(pRoot1->val!=pRoot2->val) result=false; //根节点不同肯定不同if(result) result=isSubtree(pRoot1->left,pRoot2->left); //判断两颗树的左子树是否相同if(result) result=isSubtree(pRoot1->right,pRoot2->right);//判断两颗树的右子树是否相同return result;}
};

运行时间:3ms

占用内存:504k

python

# -*- coding:utf-8 -*-

第17题:

操作给定的二叉树,将其变换为源二叉树的镜像。

解题思路:

从题目中给出的例子可以看出,其实就是对树的每一层中双亲的左右孩子交换了一下。我们可以递归的访问树的每一层,然后交换每一层的双亲节点的左右孩子就可以。

  • 递归的方法:先从根节点开始,交换根节点左右孩子节点,然后调用递归,依次遍历树的左子树和右子树,交换子树中的孩子节点。

代码实现:

c++

递归实现
class Solution {public:void Mirror(TreeNode *pRoot) {//递归推出条件if(pRoot==NULL){return;}//交换根节点的两个孩子TreeNode* tempNode;tempNode = pRoot->left;pRoot->left = pRoot->right;pRoot->right = tempNode;Mirror(pRoot->left);  //递归左子树Mirror(pRoot->right); //递归右子树}
};

运行时间:4ms

占用内存:468k

python

# -*- coding:utf-8 -*-
class Solution:# 返回镜像树的根节点def Mirror(self, root):# write code hereif root == None:return ;tempNode = TreeNode(-1)tempNode = root.leftroot.left = root.rightroot.right = tempNodeself.Mirror(root.left)self.Mirror(root.right)

运行时间:34ms

占用内存:5736k

第18题:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

解题思路:

  • 设定四个变量,分别指向行,列的起始点和终止点,然后将数据遍历分成4个节阶段,分别是:从左到右,从上到下,从右向左,从下到上,每个过程结束后,对应的指针都应该变化,循环执行,直到遍历完全部的数据。

代码实现:

c++

class Solution {public:vector<int> printMatrix(vector<vector<int> > matrix) {vector<int>res;  //用来保存遍历过的数据res.clear(); int row=matrix.size();//行数int collor=matrix[0].size();//列数//计算打印的圈数int circle=((row<collor?row:collor)-1)/2+1;//圈数for(int i=0;i<circle;i++){//从左向右打印for(int j=i;j<collor-i;j++)res.push_back(matrix[i][j]);         //从上往下的每一列数据for(int k=i+1;k<row-i;k++)res.push_back(matrix[k][collor-1-i]);//判断是否会重复打印(从右向左的每行数据)for(int m=collor-i-2;(m>=i)&&(row-i-1!=i);m--)res.push_back(matrix[row-i-1][m]);//判断是否会重复打印(从下往上的每一列数据)for(int n=row-i-2;(n>i)&&(collor-i-1!=i);n--)res.push_back(matrix[n][i]);}return res;}
};

运行时间:4ms

占用内存:468k

python

# -*- coding:utf-8 -*-

第19题:

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))

解题思路:

  • 定义一个辅助栈,这个栈顶元素始终是最小值。

代码实现:

c++

class Solution {public:stack<int> stack1,stack2;void push(int value) {stack1.push(value);//两种情况下才将元素压入辅助栈中if(stack2.empty())stack2.push(value);else if(value<=stack2.top()){stack2.push(value);}}void pop() {if(stack1.top()==stack2.top())stack2.pop();stack1.pop();}int top() {return stack1.top();       }int min() {return stack2.top();}};

运行时间:2ms

占用内存:472k

python

# -*- coding:utf-8 -*-
class Solution:def __init__(self):self.data = []self.minData = []def push(self, node):# write code hereself.data.append(node)if self.minData == [] or node < self.minData[-1]:self.minData.append(node)def pop(self):# write code hereif self.data[-1] == self.minData[-1]:self.minData.pop()self.data.pop()def top(self):# write code herereturn self.data[-1]def min(self):# write code herereturn self.minData[-1]

运行时间:31ms

占用内存:5624k

第20 题:

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

解题思路:

借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。

举例:

入栈1,2,3,4,5

出栈4,5,3,2,1

首先1入辅助栈,此时栈顶1≠4,继续入栈2

此时栈顶2≠4,继续入栈3

此时栈顶3≠4,继续入栈4

此时栈顶4=4,出栈4,弹出序列向后一位,此时为5,,辅助栈里面是1,2,3

此时栈顶3≠5,继续入栈5

此时栈顶5=5,出栈5,弹出序列向后一位,此时为3,,辅助栈里面是1,2,3

….

依次执行,最后辅助栈为空。如果不为空说明弹出序列不是该栈的弹出顺序

代码实现:

c++

class Solution {public:bool IsPopOrder(vector<int> pushV,vector<int> popV) {if(pushV.size() == 0) return false;  vector<int> stack;for(int i = 0,j = 0 ;i < pushV.size();){stack.push_back(pushV[i++]);while(j < popV.size() && stack.back() == popV[j]){  //当辅助栈的栈顶元素与弹出栈的相同,则将辅助栈的元素弹出,同时继续遍历弹出栈stack.pop_back();j++;}      }return stack.empty();}
};

运行时间:3ms

占用内存:380k

python

# -*- coding:utf-8 -*-

原 剑指offer(刷题11-20)--c++,Python版本相关推荐

  1. 剑指offer(刷题1-10)--c++,Python版本

    文章目录 目录 第一题: 解题思路: 代码实现: c++ 顺序查找 二分查找 Python 第二题: 解题思路: 代码实现: c++ python 第三题: 解题思路: 代码实现: c++ 使用栈辅助 ...

  2. 剑指offer(刷题31-40)--c++,Python版本

    文章目录 目录 第31 题: 解题思路: 代码实现: c++ python 第32题: 解题思路: 代码实现: c++ python 第33题: 解题思路: 代码实现: c++ python 第34题 ...

  3. 剑指offer(刷题21-30)--c++,Python版本

    文章目录 目录 第 21题: 解题思路: 代码实现: c++ python 第22 题: 解题思路: 代码实现: c++ python 第23 题: 解题思路: 代码实现: c++ python 第2 ...

  4. 剑指offer(刷题51-60)--c++,Python版本

    文章目录 目录 第51题: 解题思路: 代码实现: c++ python 第52题: 解题思路: 代码实现: c++ python 第53题: 解题思路: 代码实现: c++ python 第54题: ...

  5. 剑指offer(刷题41-50)--c++,Python版本

    文章目录 目录 第41题: 解题思路: 代码实现: c++ python 第42题: 解题思路: 代码实现: c++ python 第43题: 解题思路: 代码实现: c++ python 第44题: ...

  6. 剑指offer(刷题61-65)--c++,Python版本

    文章目录 目录 第61题: 解题思路: 代码实现: c++ python 第62题: 解题思路: 代码实现: c++ python 第63题: 解题思路: 代码实现: c++ python 第64题: ...

  7. 剑指offer刷题记录 python3 Java

    剑指offer刷题记录 python3 Java 剑指 Offer 09. 用两个栈实现队列 剑指 Offer 10- I. 斐波那契数列 剑指 Offer 03. 数组中重复的数字 [★]剑指 Of ...

  8. 【LeetCode 剑指offer刷题】矩阵题1:4 有序矩阵中的查找( 74. Search a 2D Matrix )(系列)...

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 74. Search a 2D Matrix Write an efficient algorithm that s ...

  9. 【LeetCode 剑指offer刷题】数组题2:57 有序数组中和为s的两个数(167 Two Sum II - Input array is sorted)...

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 57 有序数组中和为s的两个数 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是 ...

最新文章

  1. 中国云计算厂商营收排名:阿里云完虐微软
  2. TCP服务器端和客户端建立连接 - 客户端的回调处理
  3. 感受机房管理化繁为简-新款KVM使用心得
  4. 试试这个Excel知识测验,得分超过80分算你赢
  5. PHP中怎样实现正负数的相加,PHP 求任意n个正负整数里面最大的连续和
  6. Fence Repair(POJ-3253)
  7. 2019,微软研究项目盘点
  8. 【Linux】Linux中变量#,@,0,1,2,*,$$,$?的解释
  9. Mybatis 的日志管理
  10. 邮件服务系列之一基础原理
  11. 荣耀电脑,win11增加pin码登录选项后:电脑出现问题,你的PIN不可用。请单击以重新设置
  12. WORD里表格(图表、框图、形状)复制到另一WORD里表格会变形的解决办法
  13. 做为软件测试的前辈,你能不能给我一点建议?
  14. ORAN C平面 Section Extension 8
  15. 进程调度算法-生产者消费者问题
  16. Android数据加密DES、3DES、AES
  17. 基于ResNET50模型进行迁移学习构建中药饮片分类Web App
  18. 【开源电路】STM32F401RCT6开发板
  19. GSM之AT操作命令详解
  20. TT马达平衡小车制作

热门文章

  1. BootLoader与Linux内核的参数传递
  2. ARM中的ldr指令与adr、ldr伪指令之间的区别
  3. c语言整型数组操作,c语言的数组操作|时刻需
  4. zookeeper 可视化_大厂,常用,四款,大屏可视化工具
  5. leftjoin多表联合查询_leetcode-sql练习精讲系列文章——一、多表如何连接
  6. pp助手苹果版_再见!PP助手iOS端即将下线 曾是中国最大的苹果助手
  7. 【转】C# 动态对象(dynamic)的用法
  8. 【转】Microsoft Teams快速上手系列-02Teams组成概述及使用分享
  9. 34观察者模式(Observer Pattern)
  10. Office Web Apps安装部署(一)