剑指offer(36-40)编程题
36.输入两个链表,找出它们的第一个公共结点。
class Solution1 {
public:
ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) {
ListNode* p = pHead1;
ListNode* q = pHead2;
unordered_set<ListNode*> us;
while (p) {
us.insert(p);
p = p->next;
}
while (q) {
if (us.find(q) != us.end()) {
return q;
}
q = q->next;
}
return nullptr;
}
}; class Solution2 {
public:
ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) {
ListNode* p = pHead1;
ListNode* q = pHead2;
int n1 = , n2 = ;
while (p) {
n1++;
p = p->next;
}
while (q) {
n2++;
q = q->next;
}
p = pHead1;
q = pHead2;
if (n1 > n2) {
for (int i = ; i < n1 - n2; i++) {
p = p->next;
}
} else {
for (int i = ; i < n2 - n1; i++) {
q = q->next;
}
}
while (p) {
if (p == q)
return p;
else {
p = p->next;
q = q->next;
break;
}
}
return p;
}
};
37.统计一个数字在排序数组中出现的次数。
class Solution {
private:
//not found ,return -1
int getFirstK(vector<int>& data, int left, int right, int k) {
if (left > right) return -;
int mid = left + (right - left) / ;
if (data[mid] > k) return getFirstK(data, left, mid - , k);
else if (data[mid] < k) return getFirstK(data, mid + , right, k);
else if (data[mid] == k && data[mid - ] == k)
return getFirstK(data, left, mid - , k);
else return mid;
}
//not found ,return -1
int getLastK(vector<int>&data,int left,int right,int k){
if(left > right) return -;
int mid = left + (right-left)/;
if(data[mid] < k) return getLastK(data,mid+,right,k);
else if(data[mid] >k) return getLastK(data,left,mid-,k);
else if(data[mid] == k && data[mid+] ==k)
return getLastK(data,mid+,right,k);
else return mid;
}
public:
int GetNumberOfK(vector<int>& data, int k) {
int n = data.size();
if(n == ) return ;
//not found ,return -1
int firstK = getFirstK(data, , n - , k);
int lastK = getLastK(data,,n-,k);
if(firstK == -) return ;
return lastK - firstK + ;
}
};
38. 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
int TreeDepth(TreeNode* pRoot) {
if (pRoot == nullptr) return ;
int level = ;
queue<TreeNode*> q1;
queue<TreeNode*> q2;
q1.push(pRoot);
while (!q1.empty()) {
level++;
while (!q1.empty()) {
TreeNode* tmp = q1.front();
q1.pop();
if (tmp->left) q2.push(tmp->left);
if (tmp->right) q2.push(tmp->right);
}
swap(q1, q2);
}
return level;
}
};
39.输入一棵二叉树,判断该二叉树是否是平衡二叉树。
class Solution {
private:
bool IsBalanced(TreeNode* pRoot, int& depth) {
if (pRoot == nullptr) {
depth = ;
return true;
}
int leftDepth, rightDepth; if (IsBalanced(pRoot->left, leftDepth)
&& IsBalanced(pRoot->right, rightDepth)) {
if(abs(leftDepth - rightDepth)<){
depth = max(leftDepth,rightDepth)+;
return true;
}
}
return false;
}
public:
bool IsBalanced_Solution(TreeNode* pRoot) {
if (pRoot == nullptr) return true;
int depth = ;
return IsBalanced(pRoot, depth);
}
};
40.一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
class Solution {
public:
void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {
int n = data.size();
int xorAll = ;
for (int i = ; i < n; i++) {
xorAll ^= data[i];
}
//find first bit is 1
unsigned int index = ;
//与或操作记得加括号
while ((xorAll & ) == && index < * sizeof(int)) {
index++;
xorAll = xorAll >> ;
}
*num1 = ;
*num2 = ;
int splitNum = << index;
for (int i = ; i < n; i++) {
//与或操作要加括号
if ((data[i] & splitNum) == ) {
*num1 ^= data[i];
} else {
*num2 ^= data[i];
}
}
}
};
剑指offer(36-40)编程题的更多相关文章
- 剑指 Offer 36. 二叉搜索树与双向链表 + 中序遍历 + 二叉排序树
剑指 Offer 36. 二叉搜索树与双向链表 Offer_36 题目描述 题解分析 本题考查的是二叉树的中序遍历以及二叉排序树的特征(二叉排序树的中序遍历序列是升序序列) 利用排序二叉树中序遍历的性 ...
- 剑指 Offer 36. 二叉搜索树与双向链表
剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的 ...
- 【Java】 剑指offer(36) 二叉搜索树与双向链表
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不 ...
- 剑指offer 面试40题
面试40题: 题目:最小的k个数 题:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解题代码一: # -*- coding ...
- 【剑指Offer】俯视50题之31 - 40题
面试题31连续子数组的最大和 面试题32从1到n整数中1出现的次数 面试题33把数组排成最小的数 面试题34丑数 面试题35第一个仅仅出现一次的字符 面试题36数组中的逆序对 面试题37两个链表的第一 ...
- 剑指offer第40题
package com.yan.offer; /** * 题目描述: * * 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. * * @author Ya ...
- 每日一题 - 剑指 Offer 36. 二叉搜索树与双向链表
题目信息 时间: 2019-06-29 题目链接:Leetcode tag: 二叉搜索树 中序遍历 递归 深度优先搜索 难易程度:中等 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循 ...
- [持久更新] 剑指offer题目Python做题记录
第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...
- 【剑指Offer】俯视50题之21 - 30题
面试题21包括min函数的栈 面试题22栈的压入.弹出序列 面试题23从上往下打印二叉树 面试题24二叉搜索树的后序遍历序列 面试题25二叉树中和为某一值的路径 面试题26复杂链表的复制 ...
- 《剑指offer》第十三题(机器人的运动范围)
// 面试题:机器人的运动范围 // 题目:地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动,它 // 每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和 // ...
随机推荐
- 作业3:PSP记录耗时情况
PSP2.1 Personal Software Process Stage Time planning 计划 10min Estimate 估计这个任务多久完成 150min Developing ...
- struts2拦截器demo
按照网上的一些资料配置的,期间也出现过几个错误. 其中有个错误,是关于struts.xml里面package配置的问题,因为里面的几个标签是有顺序的. 顺序是: result-types interc ...
- makefile文件。批处理文件。
makefile文件: NAME=XXX #要编译的文件名 OBJS=$(NAME).obj #指定输出的目标文件名 ML_FLAG=/C /COF ...
- Android : M 与 N 的权限管理
从 M 开始,permission 分为 Normal permission Runtime permission Normal permission 直接在 manifest 里声明就可以用了. a ...
- 3、Orcal表空间分配、新建用户、新用户创建连接
1.创建表空间: 在管理员连接打开sql面板,输入如下内容: CREATE TABLESPACE DXYX DATAFILE 'E:\app\Administrator\product\11.2.0\ ...
- 十二生肖查询网页版制作(php)
今天无聊做了一个十二生肖查询器: 预览网址效果:http://hongxing01.hktd02u.me48.com/03Sxcx 源代码下载:http://down.51cto.com/data/1 ...
- LOJ#2190. 「SHOI2014」信号增幅仪(最小圆覆盖)
题面 传送门 题解 我连椭圆是个啥都不知道导致这么简单一道题我一点思路都没有-- 我们把坐标系旋转一下,让半长轴成为新的\(x\)轴,也就是说所有点都绕原点逆时针旋转\(360-a\)度,然后再把所有 ...
- windows环境下ElasticSearch5以上版本安装head插件
我的ElasticSearch版本是5以上的,网上搜了好多安装方式,都不对. 还好找到一个成功的,转载过来做记录. 原文地址:ElasticSearch-5.0安装head插件 步骤 下载node.j ...
- Redis Sentinel初体验
自Redis增加Sentinel集群工具以来,本博主就从未尝试过使用该工具.最近在调研目前主流的Redis集群部署方案,所以详细地看了一遍官方对于Sentinel的介绍并在自己的台式机上完成了 ...
- 本机号码认证黑科技:极光(JG)开发者服务推出“极光认证”新产品
近日,中国领先的大数据服务商极光(JG)推出全新产品--极光认证JVerification.极光认证是极光针对APP用户注册登陆,二次安全验证等身份验证场景打造的一款本机号码认证SDK,验证用户提供的 ...