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)编程题的更多相关文章

  1. 剑指 Offer 36. 二叉搜索树与双向链表 + 中序遍历 + 二叉排序树

    剑指 Offer 36. 二叉搜索树与双向链表 Offer_36 题目描述 题解分析 本题考查的是二叉树的中序遍历以及二叉排序树的特征(二叉排序树的中序遍历序列是升序序列) 利用排序二叉树中序遍历的性 ...

  2. 剑指 Offer 36. 二叉搜索树与双向链表

    剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的 ...

  3. 【Java】 剑指offer(36) 二叉搜索树与双向链表

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不 ...

  4. 剑指offer 面试40题

    面试40题: 题目:最小的k个数 题:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解题代码一: # -*- coding ...

  5. 【剑指Offer】俯视50题之31 - 40题

    面试题31连续子数组的最大和 面试题32从1到n整数中1出现的次数 面试题33把数组排成最小的数 面试题34丑数 面试题35第一个仅仅出现一次的字符 面试题36数组中的逆序对 面试题37两个链表的第一 ...

  6. 剑指offer第40题

    package com.yan.offer; /** * 题目描述: * * 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. * * @author Ya ...

  7. 每日一题 - 剑指 Offer 36. 二叉搜索树与双向链表

    题目信息 时间: 2019-06-29 题目链接:Leetcode tag: 二叉搜索树 中序遍历 递归 深度优先搜索 难易程度:中等 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循 ...

  8. [持久更新] 剑指offer题目Python做题记录

    第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...

  9. 【剑指Offer】俯视50题之21 - 30题

    面试题21包括min函数的栈  面试题22栈的压入.弹出序列  面试题23从上往下打印二叉树  面试题24二叉搜索树的后序遍历序列  面试题25二叉树中和为某一值的路径  面试题26复杂链表的复制  ...

  10. 《剑指offer》第十三题(机器人的运动范围)

    // 面试题:机器人的运动范围 // 题目:地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动,它 // 每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和 // ...

随机推荐

  1. mdadm 软RAID

    mdadm是linux下用于创建和管理软件RAID的命令,是一个模式化命令.但由于现在服务器一般都带有RAID阵列卡,并且RAID阵列卡也很廉价,且由于软件RAID的自身缺陷(不能用作启动分区.使用C ...

  2. RoadFlow ASP.NET Core工作流引擎IIS部署

    RoadFlow最新版本采用ASP.NET CORE2.1开发,部署步骤和.NET CORE部署一样,具体可参数ASP.NET CORE的部署方式. 1. 获取代码 首先从RoadFlow官网下载最新 ...

  3. WPF自定义ComboBox

    <ControlTemplate x:Key="ComboBoxTextBox" TargetType="{x:Type TextBox}"> &l ...

  4. brew安装指定版本boost

    brew 如何安装指定版本的boost brew uninstall boost brew install boost@1.57 brew link boost@1.57 --force --over ...

  5. Cookie背景了解

    Cookie的复数形态是Cookies, 英文的意思是小甜饼,小饼干. 类型为小型文本文件, 指某些网站为了辨别用户身份储存在用户本地中断上的数据. 是前网景公司的员工 卢-蒙特利在1993年3月发明 ...

  6. java学习笔记—JDBC1(16)

    1.数据持久化 l  持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用,也称为“固化”.在大多数情况下,服务器或客户端应用中数据的持久化是通过关系型数据库来实现 l  存储 ...

  7. 微信小程序二维码是无法识别二维码跳转到小程序

    今天测试了一下,微信小程序圆形二维码是不能直接识别跳转到小程序: 但h5页面的那种微信公众号二维码是可以直接识别

  8. 微信小程序下可以使用的MD5以及AES加密(通用)

    两段代码都来自网络 ,在小程序下的加解密结果与CS/BS等算出的结果都一致,支持汉字. 一.MD5: var rotateLeft = function (lValue, iShiftBits) { ...

  9. 我从Linux走来,选择了Windows

    我从Linux走来,选择了Windows 几天前就想提笔写下这篇,理解很多人一定会对言论不苟同. 但是我相信您看完一个一年多的Linux用户写完的以后,一定也不会太反对 一.为什么我成为一名 Linu ...

  10. C语言多线程编程二

    一. 线程通信----事件: 1.一对一模式: #include <stdio.h> #include <stdlib.h> #include <Windows.h> ...