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的更多相关文章

  1. 剑指 Offer 37. 序列化二叉树 + 二叉树的层次遍历

    剑指 Offer 37. 序列化二叉树 Offer_37 题目描述 题目解析 本题主要考察的就是二叉树的层次遍历. 层次遍历时可以根据二叉树的特点将空结点也进栈. 反序列化时同样可以根据层次遍历的思路 ...

  2. 力扣 - 剑指 Offer 37. 序列化二叉树

    目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 37. 序列化二叉树 思路 序列化其实就是层序遍历 但是,要能反序列化的话,前.中.后.层序遍历是不够的,必须在序列化时候保存所有信息,这样 ...

  3. 剑指offer 面试42题

    面试42题: 题目:连续子数组的最大和 题:输入一个整形数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n) 解题思路:在数组里从前 ...

  4. 【Java】 剑指offer(37) 序列化二叉树

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现两个函数,分别用来序列化和反序列化二叉树. 思路 一般情况下 ...

  5. 【剑指offer】42.和为S的两个数字

    42.和为S的两个数字 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 示例: 输入:[1,2,4,7,11 ...

  6. 剑指offer(42)和为S的字符串

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 题目 ...

  7. 剑指Offer 37. 数字在排序数组中出现的次数 (数组)

    题目描述 统计一个数字在排序数组中出现的次数. 题目地址 https://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId ...

  8. [剑指Offer] 37.数字在排序数组中出现的次数

    题目描述 统计一个数字在排序数组中出现的次数. [思路]因为是排序数组,所以可以用二分法搜索到要查找的值在数组中的一个位置,接着向两侧扫描,遇到不等的就停止. class Solution { pub ...

  9. 【剑指Offer】42、和为S的两个数字

      题目描述:   输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的.   输出描述:   对应每个测试案例,输出两个数, ...

  10. 剑指offer——37复杂链表的复制

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

随机推荐

  1. Go以及调试工具dlv安装及使用

    安装go wget https://studygolang.com/dl/golang/go1.14.1.linux-amd64.tar.gz tar -C /usr/local -zxvf go1. ...

  2. WEB安全防护相关响应头(上)

    WEB 安全攻防是个庞大的话题,有各种不同角度的探讨和实践.即使只讨论防护的对象,也有诸多不同的方向,包括但不限于:WEB 服务器.数据库.业务逻辑.敏感数据等等.除了这些我们惯常关注的方面,WEB ...

  3. C语言编译器开发之旅(开篇)

    编译器写作之旅   最近在Github上看到一个十分有趣的项目acwj(A Compiler Writing Journey),一个用C语言编写编译器的项目.身为一个程序员,这在我看来是一件十分酷的事 ...

  4. Docker学习(11) Dockerfile指令

    Dockerfile指令 指令格式 FROM MAINTAINER RUN EXPOSE CMD ENTRYPOINT ADD COPY VOLUME WORKDIR ENV USER ONBUILD ...

  5. Go基础结构与类型03---标准输入与输出

    package main import ( "fmt" "strconv" ) //每次接收一个用户输入 func main031() { //定义a, b两个 ...

  6. 多核片上系统(SoC)架构的嵌入式DSP软件设计

    多核片上系统(SoC)架构的嵌入式DSP软件设计 Multicore a System-on-a-Chip (SoC) Architecture SoCs的软件开发涉及到基于最强大的计算模型在各种处理 ...

  7. 最小高度树Java版本(力扣)

    最小高度树 给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树. 示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10, ...

  8. python取整函数 向上取整 向下取整 四舍五入

    向上取整 >>> import math >>> math.ceil(3.5) 4 >>> math.ceil(3.4) 4 >>&g ...

  9. 为什么Mongodb索引用B树,而Mysql用B+树?

    引言 好久没写文章了,今天回来重操旧业. 今天讲的这个主题,是<面试官:谈谈你对mysql索引的认识>,里头提到的一个坑. 也就是说,如果面试官问的是,为什么Mysql中Innodb的索引 ...

  10. JDK并发包一

    JDK并发包一 同步控制是并发程序必不可少的重要手段,synchronized是一种最简单的控制方法.但JDK提供了更加强大的方法----重入锁 重入锁 重入锁使用java.util.concurre ...