剑指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)的格子开始移动,它 // 每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和 // ...
随机推荐
- [转载]SQL Server行列转换实现
可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法: table_source PIVOT( 聚合函数(value_ ...
- .NET中Debug模式与Release模式差别
Debug里的PDB是full,保存着调试和项目状态信息.有断言.堆栈检查等代码.Release 里的PDB是pdb-only,基本上:出什么错了+错误在哪行. 因为很多人把PDB理解成:调试文件.P ...
- WPF定时刷新UI界面
代码: using NHibernate.Criterion; using System; using System.Collections.Generic; using System.Collect ...
- sharepoint 2013 search configuration
在建立search application之前完成以下命令 $hostA = Get-SPEnterpriseSearchServiceInstance -Identity "WTCSPS0 ...
- python--函数名的使用,闭包,迭代器
1.函数名的使用和第一类对象 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数 函数对象可以像变量一样进行赋值,还可以作为列表的元素进行使用,可以作为返回值返回,可以作为参数进行传递 1 ...
- Gogland编译LiteIDE工程需要注意问题!
致歉声明:实在抱歉,因为自己对Go语言和Gogland的不熟悉,导致错误判断!无论LiteIDE和Goland都可以顺利使用同一个包下的其它文件内容!!Go语言本身就允许把一个包拆分成不同的文件,下面 ...
- php中mvc框架总结1(7)
1.代码结构的划分: 目前的目录结构: /站点根目录 /application/应用程序目录 Model/模型目录 View/视图目录 Back/后台 front/ test/测试平台 Control ...
- 546. Remove Boxes
Given several boxes with different colors represented by different positive numbers. You may experie ...
- 浅析group by,having count()
SELECT COUNT(*) FROM (SELECT COUNT(id),order_type,city_id,category_id,major_category_id,puid,user_id ...
- 代码 | 自适应大邻域搜索系列之(2) - ALNS算法主逻辑结构解析
00 前言 在上一篇推文中,教大家利用了ALNS的lib库求解了一个TSP问题作为实例.不知道你萌把代码跑起来了没有.那么,今天咱们再接再厉.跑完代码以后,小编再给大家深入讲解具体的代码内容.大家快去 ...