剑指offer 66题 part3(13~18题)

2024-02-13 16:38
文章标签 18 13 offer 66 part3

本文主要是介绍剑指offer 66题 part3(13~18题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第十三题:调整数组顺序

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

题解:

方法一:

直接在vector中删除所有偶数,依次尾插到vector中即可

if(((*t)&1)==0)

注意这里判断奇偶,由于优先级问题,要多用括号

t=array.erase(t);
这里删除一个元素返回的是被删除元素的下一个位置
class Solution {
public:void reOrderArray(vector<int> &array) {vector<int>::iterator t=array.begin();int len=array.size(),num;while(size--){if(((*t)&1)==0){num=*t;t=array.erase(t);array.push_back(num);}else t++;}}
};

方法二:

先找到第一个偶数,然后再在偶数后面找第一个奇数,删除这个奇数,把所有偶数往后移动一位,然后把奇数往空格放,依次执行即可得到答案

第十四题:链表中倒数第K个节点

输出链表中倒数第K个节点

方法一:第一遍扫描计算有多少个节点,第二遍直接定位到这个点就行了

方法二:用两个指针,第一个指针先指向第 k 个节点,第二个节点指向第一个节点,然后同时往后移动到第一个节点不能移动的时候即可

代码的鲁棒性:(重要

1 · 头结点指向NULL,如果我们试图访问空指针指向的内存,程序崩溃

2 · k 不能为 0   因为这里的k是无符号的数,k-1将会是一个很大的正数

3 · k不能大于链表的程度,如果这样也会出现指针指向空指针内存

注意:( .    和  -> 的区别)

通过结构体指针变量访问用"->"
通过结构体变量访问用"."
比如说:
假设student是个结构体,有一个成员int age
struct student one;
struct student *ptr;
one.age               ptr->age

代码:

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution {
public:ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {ListNode *p1=pListHead,*p2=pListHead;if(pListHead==NULL || k==0) return NULL;for(int i=1;i<k;i++){if(p1->next==NULL) return NULL;p1=p1->next;}while(p1->next!=NULL){p1=p1->next,p2=p2->next;}return p2;}
};

第十五题:反转链表

输入一个链表,反转链表后,输出链表的所有元素

题解:

思路很好理解,我们从中间开始理解,两边只是边界问题而已:

反转链表,我们这里的思路只是把指针的指向改变了而已,没有另外开辟很多内存去存

1、利用pre指针来记住反转链表的最后一个节点(这个节点不断在变换,因为会新添加节点进去)

2、利用temp来记住原始链表的第一个节点(这个节点不断在变换,因为会把这个节点放到反转链表中去)

3、把旧链表的头结点保存下来temp=pHead

4、把pHead指针指向新链表的最后一个节点,也就是pHead=pre

5、判断是否已经到了最后一个节点

6、跟新pre,temp指针(根据1、2的含义)

注意:

这里必须把while循环break掉才能return,不能直接在while循环里面return

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution {
public:ListNode* ReverseList(ListNode* pHead) {if(pHead==NULL) return NULL;ListNode *pre=NULL,*temp=NULL;while(pHead!=NULL){temp=pHead->next;pHead->next=pre;if(temp==NULL) break;pre=pHead;pHead=temp;}return pHead;}
};

第十六题:

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

题解:

方法一:

递归(牛逼啊!!!感觉剑指offer可以学到好多脑洞大开的操作)

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution {
public:ListNode* Merge(ListNode* pHead1, ListNode* pHead2){if(pHead1==NULL) return pHead2;if(pHead2==NULL) return pHead1;if(pHead1->val <= pHead2->val){pHead1->next=Merge(pHead1->next,pHead2);return pHead1;}else{pHead2->next=Merge(pHead1,pHead2->next);return pHead2;}}
};

方法二:

一般性的合并

这里需要注意理解下面两者区别

pHead!=NULL

pHead->next!=NULL

下面代码用的前者

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution {
public:ListNode* Merge(ListNode* pHead1, ListNode* pHead2){if(pHead1==NULL) return pHead2;if(pHead2==NULL) return pHead1;ListNode *head=NULL,*t=NULL;while((pHead1!=NULL) && (pHead2!=NULL)){if(pHead1->val <= pHead2->val){if(head==NULL) head=t=pHead1;else           t->next=pHead1,t=t->next;pHead1=pHead1->next;}else{if(head==NULL) head=t=pHead2;else           t->next=pHead2,t=t->next;pHead2=pHead2->next;}}if(pHead1!=NULL) t->next=pHead1;else             t->next=pHead2;return head;}
};

第十七题:树的子结构

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

题意:就是判断B树是不是A树的一个分支

题解:

递归

分别去判断左右子树即可

/*
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};*/
class Solution {
public:bool IsSubtree(TreeNode* pRoot1,TreeNode* pRoot2){if(pRoot2==NULL) return true;if(pRoot1==NULL) return false;if(pRoot1->val == pRoot2->val)return IsSubtree(pRoot1->left,pRoot2->left)&&IsSubtree(pRoot1->right,pRoot2->right);else return false;}bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)  {if(pRoot1==NULL || pRoot2==NULL) return false;return (IsSubtree(pRoot1,pRoot2) ||IsSubtree(pRoot1->left,pRoot2) ||IsSubtree(pRoot1->right,pRoot2));}
};

第十八题:树的镜像

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

输入描述:

二叉树的镜像定义:源二叉树 8/  \6   10/ \  / \5  7 9 11镜像二叉树8/  \10   6/ \  / \11 9 7  5
简单递归
/*
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};*/
class Solution {
public:void Mirror(TreeNode *pRoot) {if(pRoot==NULL) return;TreeNode* temp=pRoot->left;pRoot->left=pRoot->right;pRoot->right=temp;Mirror(pRoot->left);Mirror(pRoot->right);}
};

这篇关于剑指offer 66题 part3(13~18题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/706047

相关文章

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

13 transition数组的动画使用

划重点 动画:transitiontransition-group :数组动画数组的 添加 / 删除 豆腐粉丝汤 清淡又健康 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><me

react笔记 8-18 事件 方法 定义方法 获取/改变数据 传值

1、定义方法并绑定 class News extends React.Component {constructor(props) {super(props)this.state = {msg:'home组件'}}run(){alert("我是一个run") //方法写在类中}render() {return (<div><h2>{this.state.msg}</h2><button onCli

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

Chapter 13 普通组件的注册使用

欢迎大家订阅【Vue2+Vue3】入门到实践 专栏,开启你的 Vue 学习之旅! 文章目录 前言一、组件创建二、局部注册三、全局注册 前言 在 Vue.js 中,组件是构建应用程序的基本单元。本章详细讲解了注册和使用 Vue 的普通组件的两种方式:局部注册和全局注册。 本篇文章参考黑马程序员 一、组件创建 ①定义 Vue 组件是一种具有特定功能的 Vue 实

VMware Fusion Pro 13 Mac版虚拟机 安装Win11系统教程

Mac分享吧 文章目录 Win11安装完成,软件打开效果一、VMware安装Windows11虚拟机1️⃣:准备镜像2️⃣:创建虚拟机3️⃣:虚拟机设置4️⃣:安装虚拟机5️⃣:解决连不上网问题 安装完成!!! Win11安装完成,软件打开效果 一、VMware安装Windows11虚拟机 首先确保自己的mac开启了网络共享。不然虚拟机连不上👀的 1️⃣:准备镜像

华为 HCIP-Datacom H12-821 题库 (13)

有需要题库的可以看主页置顶 1.可以携带外部路由的 tag 标签信息的是以下哪一类 LSA? A、4 类 LSA B、5 类 LSA  C、3 类 LSA  D、2 类 LSA 答案:B 解析: 暂无解析 2..两台路由器直连,并设定网络类型为 p2p 建立OSPF 邻居。那么两台路由器传输 OSPF 报文的目的 IP 地址是以下哪一项? A、使用组播地址 224.0.0.6 B

[情商-13]:语言的艺术:何为真实和真相,所谓真相,就是别人想让你知道的真相!洞察谎言与真相!

目录 前言: 一、说话的真实程度分级 二、说谎动机分级:善意谎言、中性谎言、恶意谎言 三、小心:所谓真相:只说对自己有利的真相 四、小心:所谓真相:就是别人想让你知道的真相 五、小心:所谓善解人意:就是别人只说你想要听到的话 前言: 何为真实和真相,所谓真相,就是别人想让你知道的真相!洞察谎言与真相! 人与人交流话语中,处处充满了不真实,完全真实的只是其中一小部分,这

20190315 把整理和培养自己当作一生的事业,而不是局限在找工作拿offer。

把整理和培养自己当作一生的事业,而不是局限在找工作拿offer,做有本事的人。 来东南读研半年了,明显感觉自己掌握的不过是书本知识级别的中上水平,垃圾收集器这些的只知道背面经,靠脑子硬记,缺乏整理和系统,一头浆糊。 现在一边做实训这个烂项目,一边刷面经,一边刷剑指offer,想投些大公司的实习,又觉得还没准备好,看着各 种面经,都能说个大概,但明显感觉到自己知识的不体系和不深入,**做的项目

【代码随想录训练营第42期 续Day52打卡 - 图论Part3 - 卡码网 103. 水流问题 104. 建造最大岛屿

目录 一、做题心得 二、题目与题解 题目一:卡码网 103. 水流问题 题目链接 题解:DFS 题目二:卡码网 104. 建造最大岛屿 题目链接 题解:DFS  三、小结 一、做题心得 也是成功补上昨天的打卡了。 这里继续图论章节,还是选择使用 DFS 来解决这类搜索问题(单纯因为我更熟悉 DFS 一点),今天补卡的是水流问题和岛屿问题。个人感觉这一章节题对于刚