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. BFC开启条件

    当元素CSS属性设置了下列之一时,即可创建一个BFC: float:left|right position:absolute|fixed display: table-cell|table-capti ...

  2. vim编辑后权限不够保存问题解决方案

    常常忘记了sudo就直接用vim编辑/etc内的文件,等编辑好了,保存时候才发现没权限. 1.曲线救国:先保存个临时文件,退出后再sudo cp回去 2.可以直接用 :w !sudo tee % 查阅 ...

  3. DS博客作业01--日期抽象数据类型

    1.思维导图及学习体会(2分) 1.1第一章绪论知识点思维导图 1.2学习体会 从暑假看视频到开学的预习,我感觉数据结构与c语言比起来更加抽象,更加难理解,那些概念也只能理解一些字面意思,对时间复杂度 ...

  4. egret的tween动画循环播放

    开发中发现了egret的自带tween动画中tweenGroup没有自动重新播放的代码,就使用了一种较笨的方法进行播放 比如:我在exml皮肤文件中写了一个动画组tweenGroup,并且在ts文件中 ...

  5. JavaScript一个页面中有多个audio标签,其中一个播放结束后自动播放下一个,audio连续播放

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. spring利用注解方式实现Java读取properties属性值

    1. 建立properties文件:我在resource下面建立一个config文件夹,config文件夹里面有mytest.properties文件,文件内容如下: sam.username=sam ...

  7. 使用memcache或redis限制某个用户或者某ip用户一段时间内最大投票次数

    实现每个用户在某网站10分钟内最多投票5次 function isFrequently($key){ $t = 60*10; $n = 5; $mem = new Memcache(); $mem-& ...

  8. JavaScript基础总纲

    如果前人种好了树那我们干嘛不去享受阴凉,然后花费时间去为大树的成长进一份力. 我发现一个站点写的很全面写很系统,我总结主要分为一些几个模块: 一,JavaScript 教程(基础) 二,JavaScr ...

  9. python unittest框架理解与总结(二)

    unittest基本原理: ♦整个平台的搭建使用的是python的unittest测试框架,这里简单介绍下unittest模块的简单应用. ♦unittest是python的标准测试库,相比于其他测试 ...

  10. c语言求方阵的行列式、伴随矩阵算法

    #include<stdio.h> #include<math.h> #define N 100 //N比输入的阶数大即可 int main() {   int n,a[N][ ...