剑指offer 37-42
37.
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
思路:
1.平衡二叉树的定义为,当为空树或左右子树高度小于等于1,同时左右子树都要为平衡二叉树。
2.先分别求出左右子树的高度,比较高度差,如果高度差大于1,直接返回false,如果高度不大于1,那么则递归判断左右子树是否为平衡二叉树。
代码贴下:
class Solution {
public:
int getDepth(TreeNode* pRoot)
{
if(!pRoot)
{
return 0;
}
if(!pRoot->left&&!pRoot->right)
{
return 1;
}
int len1=getDepth(pRoot->left)+1;
int len2=getDepth(pRoot->right)+1;
return len1>len2?len1:len2;
}
bool IsBalanced_Solution(TreeNode* pRoot) {
if(!pRoot)
{
return true;
}
int llength=getDepth(pRoot->left);
int rlength=getDepth(pRoot->right);
if(llength>rlength+1||rlength>llength+1)
{
return false;
}else
{
return IsBalanced_Solution(pRoot->left)&&IsBalanced_Solution(pRoot->right);
}
}
};
题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:
1.先按升序排序(c++内置函数sort),那么如果只要是两个相同的数,都会排列在一块,假设原数组为2,4,5,5,6,4,经过排序后就变为2,4,4,5,5,6,出现次数为2的数,就会靠在一起,这时我们需要遍历一下数组,比较相邻的数字是否相等,如果相等就将遍历的指针,加2,不相等就赋值第一个数,指针加1,再碰到个不相等的,就再赋值给第二个数,break,完成任务了。
代码如下:
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
sort(data.begin(),data.end());
int p1=0;
int i=0;
while(i<data.size())
{
if(data[i]!=data[i+1])
{
if(p1==0)
{
*num1=data[i];
p1=1;
}else
{
*num2=data[i];
}
i++;
}else
{
i+=2;
}
}
}
};
题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?
Good Luck!
思路:
1.连续的序列的和,那么等差数列和的n(a1+an)/2公式肯定是少不了的。
2.双指针,相等于一个滑动窗口,不断的扩大和缩小。直接看代码吧,比较简单。
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> buffer;
int i=1;
int j=2;
int res=0;
while(i<j)
{
res=((i+j)*(j-i+1))/2;
if(res==sum)
{
vector<int> inside;
for(int z=i;z<=j;z++)
{
inside.push_back(z);
}
buffer.push_back(inside);
i++;
}else if(res>sum)
{
i++;
}else if(res<sum)
{
j++;
}
}
return buffer;
}
};
题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
思路:
双重循环,遍历,就完事了。
代码如下;
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int> res;
for(int i=0;i<array.size();i++)
{
for(int j=i+1;j<array.size();j++)
{
if(sum-array[i]==array[j])
{
res.push_back(array[i]);
res.push_back(array[j]);
return res;
}
}
}
return res;
}
};
题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
思路:
左移多少位,相等于将前几位,拼接到后面去了,抱着这种思路去写,当然不止我这种写法,我这种删除的,也可以用截取的,看个人吧。
代码如下:
class Solution {
public:
string LeftRotateString(string str, int n) {
if(n<0) return NULL;
if(n==0)return str;
string str1=str.substr(0,n);
str.erase(0,n);
str+=str1;
return str;
}
};
题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路:
以空格分割开来,成为一个数组,之后再调换,最后再遍历一下,拼接起来,这里用的是java写的,c++对字符串感觉没java友好。
public class Solution {
public String ReverseSentence(String str) {
if(str==null)
{
return null;
}
if(str.trim().equals(""))
{
return str;
}
String[] a=str.split(" ");
String res="";
int j=a.length-1;
int i=0;
while(i<j)
{
String tmp=a[i];
a[i]=a[j];
a[j]=tmp;
i++;
j--;
}
for(int x=0;x<a.length;x++)
{
res+=a[x];
if(x!=a.length-1)
{
res+=" ";
}
}
return res;
}
}
剑指offer 37-42的更多相关文章
- 剑指 Offer 37. 序列化二叉树 + 二叉树的层次遍历
剑指 Offer 37. 序列化二叉树 Offer_37 题目描述 题目解析 本题主要考察的就是二叉树的层次遍历. 层次遍历时可以根据二叉树的特点将空结点也进栈. 反序列化时同样可以根据层次遍历的思路 ...
- 力扣 - 剑指 Offer 37. 序列化二叉树
目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 37. 序列化二叉树 思路 序列化其实就是层序遍历 但是,要能反序列化的话,前.中.后.层序遍历是不够的,必须在序列化时候保存所有信息,这样 ...
- 剑指offer 面试42题
面试42题: 题目:连续子数组的最大和 题:输入一个整形数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n) 解题思路:在数组里从前 ...
- 【Java】 剑指offer(37) 序列化二叉树
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现两个函数,分别用来序列化和反序列化二叉树. 思路 一般情况下 ...
- 【剑指offer】42.和为S的两个数字
42.和为S的两个数字 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 示例: 输入:[1,2,4,7,11 ...
- 剑指offer(42)和为S的字符串
题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 题目 ...
- 剑指Offer 37. 数字在排序数组中出现的次数 (数组)
题目描述 统计一个数字在排序数组中出现的次数. 题目地址 https://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId ...
- [剑指Offer] 37.数字在排序数组中出现的次数
题目描述 统计一个数字在排序数组中出现的次数. [思路]因为是排序数组,所以可以用二分法搜索到要查找的值在数组中的一个位置,接着向两侧扫描,遇到不等的就停止. class Solution { pub ...
- 【剑指Offer】42、和为S的两个数字
题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数, ...
- 剑指offer——37复杂链表的复制
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...
随机推荐
- Android开发Activity全局切换的动画效果
切换动画 slide_left_in.xml 从左边进 --> 退出的时候使用 <?xml version="1.0" encoding="utf-8&quo ...
- MongoDB(12)- 查询嵌入文档的数组
插入测试数据 db.inventory.insertMany( [ { item: "journal", instock: [ { warehouse: "A" ...
- 六、.net core (.NET 6)程序部署到Docker上
使用Docker部署应用程序 首先确保已经安装Docker 桌面软件,如下图: 然后,把需要部署到Docker上面的项目,咱们先添加Docker的支持,启动项目右键 -> 添加 -> Do ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十六)——dapr+sentinel中间件实现服务保护
dapr目前更新到了1.2版本,在之前4月份的时候来自阿里的开发工程师发起了一个dapr集成Alibaba Sentinel的提案,很快被社区加入到了1.2的里程碑中并且在1.2 release 相关 ...
- Eclipse从SVN中检出项目缺少Jar包的问题
Eclipse从SVN中检出项目缺少Jar包的问题
- TheSuperego 实验五 团队作业2:毕业设计选题系统
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-dai ...
- 多目标跟踪:CVPR2019论文阅读
多目标跟踪:CVPR2019论文阅读 Robust Multi-Modality Multi-Object Tracking 论文链接:https://arxiv.org/abs/1909.0385 ...
- 图像实例分割:CenterMask
图像实例分割:CenterMask CenterMask: single shot instance segmentation with point representation 论文链家: http ...
- IoU、GIoU、DIoU、CIoU损失函数
IoU.GIoU.DIoU.CIoU损失函数 目标检测任务的损失函数由Classificition Loss和Bounding Box Regeression Loss两部分构成.目标检测任务中近几年 ...
- 那些年,我们一起做过的KNX智能化控制经典案例!
那些年,我们一起做过的KNX经典案例! 光阴之箭已经穿越年轮,抵达2021 GVS在2008年加入KNX国际协会,成为中国首批引进KNX标准的企业,此后,还率先研发出基于KNX的核心协议栈,定标准,做 ...