剑指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)的格子开始移动,它 // 每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和 // ...
随机推荐
- ASP.NET Core2集成Office Online Server(OWAS)实现办公文档的在线预览与编辑(支持word\excel\ppt\pdf等格式)
Office Online Server是微软开发的一套基于Office实现在线文档预览编辑的技术框架(支持当前主流的浏览器,且浏览器上无需安装任何插件,支持word.excel.ppt.pdf等文档 ...
- long polling
Regular http: client 发出请求到server server 计算 response server 响应 response 给 client Polling: A client re ...
- apache mpm的一些问题
win2003系统下apache环境,mpm_winnt.c模式,优化参数: ThreadsPerChild 说明:每个子进程建立的线程数,默认值:64,最大值:1920.网上查询资料建议设置在100 ...
- UDP通讯
上一篇有说到TCP通讯,这篇来谈谈UDP通讯方式 基于Udp协议是无连接模式通讯,占用资源少,响应速度快,延时低.至于可靠性,可通过应用层的控制来满足.(不可靠连接) (1).建立一个套接字(Sock ...
- mysql--对行(表中数据)的增删改查
一.插入数据(增加)insert 1.插入数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); #指定字段来插入数据,插 ...
- tcping测试端口是否畅通
https://elifulkerson.com/projects/tcping.php 下载tcping.exe 执行exec文件或者放到C:\Window目录下执行 tcping IP 端口
- leetcode-374-Guess Number Higher or Lower(二分查找)
题目描述: We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have t ...
- python3.6的request
request实例1: import requests payload = {'key1':'value','key2':'value2'} url = "http://httpbin.or ...
- mongodb主从备份 和 手动主从切换
环境: 主机A:172.16.160.91 主机B:172.16.160.92 配置主机A [root@master zhxf]# cat docker-compose.yml version: '3 ...
- TX2 安装v4l
在TX2上使用v4l2-ctl --all -d /dev/video0查看相机参数时报错: v4l2-ctl :command not found 手动安装: sudo apt-get instal ...