剑指offer 66题 part5(25~30题)

2024-02-13 16:38
文章标签 25 30 offer 66 part5

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

第二十五题:复杂链表的复制

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

通过看图以及下面代码的注释,就可以很快的看懂啦

/*
struct RandomListNode {int label;struct RandomListNode *next, *random;RandomListNode(int x) :label(x), next(NULL), random(NULL) {}
};
*/
class Solution {
public:RandomListNode* Clone(RandomListNode* pHead){if(!pHead) return NULL;RandomListNode* cur=pHead;while(cur){///本循环是克隆每一个节点RandomListNode* cloneNode=new RandomListNode(cur->label);//下面三行是交换,类似swap的思想RandomListNode* nextNode=cur->next;cur->next=cloneNode;cloneNode->next=nextNode;///移动指针cur=nextNode;}cur=pHead;while(cur){///复制老节点的随机指针给新节点cur->next->random=cur->random?cur->random->next:NULL;cur=cur->next->next;}cur=pHead;RandomListNode* ans=pHead->next;while(cur){///拆分链表RandomListNode* cloneNode=cur->next;cur->next=cloneNode->next;cloneNode->next=cloneNode->next?cloneNode->next->next:NULL;cur=cur->next;}return ans;}
};

第二十六题:二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向

题解:

因为二叉搜索树可以看做是有序的,故可以利用其左右儿子当做双向链表的前后指针

然后又发现,其实中序遍历BST就是我们所需要的答案,但是我们是需要转换指针指向的,所以看下面代码,纸上面模拟即可

/*
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};*/
class Solution {
private:TreeNode * leftHead=NULL,* rightHead=NULL;
public:TreeNode* Convert(TreeNode* pRootOfTree){if(!pRootOfTree) return NULL;Convert(pRootOfTree->left);if(!leftHead) leftHead=rightHead=pRootOfTree;else{rightHead->right=pRootOfTree;pRootOfTree->left=rightHead;rightHead=rightHead->right;}Convert(pRootOfTree->right);return leftHead;}
};

第二十七题:字符串的排列

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba

题解:

每次两两交换,就能得到新的我们所需要的串

模拟这个思想即可

class Solution {
private:void deal(vector<string> &ans,string str,int p){if(p==(str.size()-1)) ans.push_back(str);for(int i=p;i<str.size();i++){if(i!=p&&str[i]==str[p]) continue;//这里在i!=p的时候才去判断是不是不同的字母swap(str[i],str[p]);//i==p的时候我们也要递归,意思是原样不懂的str也可以作为一个排列deal(ans,str,p+1);swap(str[i],str[p]);//进行两次交换是dfs的常态思想}}
public:vector<string> Permutation(string str) {vector<string>ans;///字符串类型if(str.size()==0) return ans;deal(ans,str,0);sort(ans.begin(),ans.end());return ans;}
};

第二十八题:数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0

题解:

超过一半,则必然和其他的数字进行抵消能剩余

class Solution {
public:int MoreThanHalfNum_Solution(vector<int> numbers) {int size=numbers.size(),cnt=1,num=numbers[0];for(int i=1;i<size;i++){if(numbers[i]==num) cnt++;else                cnt--;if(!cnt) num=numbers[i],cnt=1;}cnt=0;for(int i=0;i<size;i++)if(num==numbers[i]) cnt++;return cnt*2>size?num:0;}
};

第二十九题:最小的k个数

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,

题解:

方法很多:优先队列,堆排序等等各种排序

class Solution {
public:vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {vector<int>ans;if(input.size()<k) return ans;sort(input.begin(),input.end());for(int i=0;i<k;i++)ans.push_back(input[i]);return ans;}
};


第三十题:连续子数组的最大和

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少是1)

题解:

这种题目其实就是dp

简单的dp,鉴于之前搞acm已经很熟悉了就不介绍这种思路了,其实很简单的,纸上模拟一下即可

class Solution {
public:int FindGreatestSumOfSubArray(vector<int> array) {int tmp=0,ans=-0xfffffff,size=array.size();for(int i=0;i<size;i++){tmp+=array[i];if(tmp>ans) ans=tmp;if(tmp<0) tmp=0;}return ans;}
};

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



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

相关文章

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

【JavaScript】LeetCode:21-25

文章目录 21 最大子数组和22 合并区间23 轮转数组24 除自身以外数组的乘积25 缺失的第一个正数 21 最大子数组和 贪心 / 动态规划贪心:连续和(count)< 0时,放弃当前起点的连续和,将下一个数作为新起点,这里提供使用贪心算法解决本题的代码。动态规划:dp[i]:以nums[i]为结尾的最长连续子序列(子数组)和。 dp[i] = max(dp[i - 1]

c++习题30-求10000以内N的阶乘

目录 一,题目  二,思路 三,代码    一,题目  描述 求10000以内n的阶乘。 输入描述 只有一行输入,整数n(0≤n≤10000)。 输出描述 一行,即n!的值。 用例输入 1  4 用例输出 1  24   二,思路 n    n!           0    1 1    1*1=1 2    1*2=2 3    2*3=6 4

嵌入式面试经典30问:二

1. 嵌入式系统中,如何选择合适的微控制器或微处理器? 在嵌入式系统中选择合适的微控制器(MCU)或微处理器(MPU)时,需要考虑多个因素以确保所选组件能够满足项目的具体需求。以下是一些关键步骤和考虑因素: 1.1 确定项目需求 性能要求:根据项目的复杂度、处理速度和数据吞吐量等要求,确定所需的处理器性能。功耗:评估系统的功耗需求,选择低功耗的MCU或MPU以延长电池寿命或减少能源消耗。成本

【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)「首先来看看目前已有的资料,还会不断更新哦~一次购买,后续不会再被收费哦,保证是全网最全资源,随着后续内容更新,价格会上涨,越早购买,价格越低,让大家再也不需要到处买断片资料啦~💰💸👋」�

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

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

JobScheduler 调用导致的运行时长30分钟的功耗问题

一、SDK 的使用情况与功耗影响 案例是否导致功耗变大onStartJob return true 且子线程没有调用jobFinished()告知系统功耗变大,最长带来30分钟的partial wakelock 长持锁onStartJob return true 且子线程调用jobFinished()告知系统功耗有影响,主要线程执行时长,标准是30秒内onStartJob return fals

leetcode#66. Plus One

题目 Given a non-negative integer represented as a non-empty array of digits, plus one to the integer. You may assume the integer do not contain any leading zero, except the number 0 itself. The digi

2025年25届计算机毕业设计:如何实现高校实验室Java SpringBoot教学管理系统

✍✍计算机毕业编程指导师** ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、Python、微信小程序、大数据实战项目集 ⚡⚡文末获取源码 文章目录 ⚡⚡文末获取源码高校实验室教学管理系统-研究背景高校实验室教学管理系