剑指offer之36-40题解


目录

  1. 两个链表的第一个公共结点
  2. 数字在排序数组中出现的次数
  3. 二叉树的深度
  4. 平衡二叉树
  5. 数组中只出现一次的数字

36. 两个链表的第一个公共结点

(一)题目描述

输入两个链表,找出它们的第一个公共结点。

(二)思路

  1. 设A的长度为a+c,B的长度为b+c,其中c为尾部公共部分的长度,可知a+c+b = b+c+a.
  2. 当访问链表A的指针访问到链表尾部时,令它从链表B的头部重新开始访问链表B;同样的,当访问链表B的指针访问到链表尾部时,令它从链表A的头部重新开始访问链表A。这样就能控制访问A和B两个链表的指针同时访问到交点。

(三)代码实现

public class Solution {public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {ListNode l1 = pHead1, l2 = pHead2;while (l1 != l2) {l1 = (l1 == null) ? pHead2 : l1.next;l2 = (l2 == null) ? pHead1 : l2.next;}return l1;}
}

37. 数字在排序数组中出现的次数

(一)题目描述

统计一个数字在排序数组中出现的次数。

(二)思路

(三)代码实现

代码实现一:

public class Solution {public int GetNumberOfK(int[] array, int k) {int first = binarySearch(array, k);int last = binarySearch(array, k + 1);return (first == array.length || array[first] != k) ? 0 : last - first;}private int binarySearch(int[] array, int k) {int l = 0, h = array.length;while (l < h) {int m = l + (h - l) / 2;if (array[m] >= k)h = m;elsel = m + 1;}return l;}
}

代码实现二

public class Solution {public int GetNumberOfK(int [] array , int k) {int count = 0;for (int i = 0; i < array.length; i++) {if (array[i]==k){count++;}}return count;}
}

38. 二叉树的深度

(一)题目描述

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

(二)思路

  1. 递归遍历即可。

(三)代码实现

public class Solution {public int TreeDepth(TreeNode root) {return root == null ? 0 : 1 + Math.max(TreeDepth(root.left), TreeDepth(root.right));}
}

39. 平衡二叉树

(一)题目描述

输入一棵二叉树,判断该二叉树是否是平衡二叉树。

(二)思路

  1. 利用递归求出左子树和右子树的最高,如果相减的绝对值大于1,那么不是平衡二叉树,否则是平衡二叉树。

(三)代码实现

public class Solution {public boolean IsBalanced_Solution(TreeNode root) {if (root == null)return true;int left = height(root.left);int right = height(root.right);if (Math.abs(left - right) > 1)return false;return true;}private int height(TreeNode root) {return root == null ? 0 : 1 + Math.max(height(root.left), height(root.right));}
}

40. 数组中只出现一次的数字

(一)题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

(二)思路

  1. 除了有两个数字只出现了一次,其他数字都出现了两次。异或运算中,任何一个数字和自己本身异或都是0,任何一个数字和0异或都是本身。

  2. 两个不相等的元素在位级表示上必定会有一位存在不同,将数组所有元素异或得到的结果为不存在重复的两个元素异或的结果。

  3. diff &= -diff得到出diff最右侧不为0的位,也就是不存在重复的两个元素在位级上最右侧的那一位,利用这一位就可以将两个元素区分开来。

  4. 例如:数组元素为2,4,3,6,3,2,5,5,异或的结果为0010,也就是倒数第二位为1,也就是倒数第二位为标记位来进行拆分,那么第一个子数组就为{2,3,6,3,2},他们的倒数第二位为1,第二个子数组为{4,5,5}倒数第二位为0,对这两个子数组分别再异或,最终找到6和4。

(三)代码实现

public class Solution {public void FindNumsAppearOnce(int[] array, int num1[], int num2[]) {int diff = 0;for (int num : array)diff ^= num;diff &= -diff;for (int num : array) {if ((num & diff) == 0)num1[0] ^= num;elsenum2[0] ^= num;}}
}

剑指offer之36-40题解相关推荐

  1. 【难题+重点】剑指offer——面试题40:数组中只出现一次的数字

    剑指offer--面试题40:数组中只出现一次的数字 Solution1: 书中展示了很棒的思路: 关于异或的两个性质应该知道: (1) X^X = 0; (2) X^0 = X; class Sol ...

  2. 剑指offer面试题[40]-数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 注意原题目要求空间复杂度为0(1). 位运算的具体思路可以参看剑指offer. class So ...

  3. 【剑指offer】java版题解(持续更新)

    本文为刷[剑指]备战校招的过程,持续更新 备战虽晚但卷,共勉! 目录,按刷题时间排序 斐波那契数列 用两个栈实现队列 二维数组中的查找 包含min函数的栈 从尾到头打印链表 反转链表 复杂链表的复制 ...

  4. 剑指offer 面试36题

    面试36题: 题:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 解题思路一:由于输入的一个二叉搜索树, ...

  5. 剑指offer: 面试题40. 最小的k个数

    题目:最小的k个数 入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1] ...

  6. 《剑指Offer》36:二叉搜索树与双向链表

    题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向.比如,输入下图中的二叉搜索树,输出转换之后的排序双向链表. 二叉树节点的定义如下 ...

  7. 剑指Offer - 面试题40. 最小的k个数(排序/大顶堆)

    1. 题目 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1], k ...

  8. 剑指offer面试题40. 最小的k个数(sort函数)

    题目描述 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 思路 详见链接 代码 class Solution: ...

  9. C++剑指offer刷题笔记

    说明:本文是本人刷题后整理的剑指offer1-68题的题解笔记,编程语言为c++. 主要参考刷题笔记网址:leetcode剑指offer 次要参考刷题笔记网址:牛客剑指offer 剑指OFFER 面试 ...

  10. 剑指offer第二版答案详细版(带详细解题思路)

    1.滑动窗口的最大值(剑指offer原59题) 解题思路:其实是一个队列的问题,用一个队列去维护当前窗口中的所有元素:首先将超出窗口中的队头元素先删掉,然后将新的元素插入当前窗口中,插入时要判断新插入 ...

最新文章

  1. kvm虚拟机vnc配置
  2. 搞来一套大厂内部资料(内含C++面试真题集)
  3. go语言使用go-sciter创建桌面应用(八) 窗口显示时,自动加载后端数据。
  4. html实现div打印,如何在html div的中间打印/附加从按钮单击的值?
  5. js异步解决方案 --- 回调函数 vs promise vs generater/yield vs async/await
  6. 最长k可重区间集问题最长k可重线段集问题
  7. linuxmake没有指明目标并且找不到makefile_如何写makefile?
  8. MYSQL 查看表定义的 4 种方法
  9. 千千静听 dfx 音效插件_专业团队的蝰蛇音效,好听就是好软件
  10. oracle发生20001,Oracle IMP数据时报20001错误
  11. matlab筛选excel数据统计,MATLAB读取Excel筛选符合条件的数据进行求均值等处理 程序......
  12. b站修改密码服务器错误,提示账号或者密码错误,无法正常登陆
  13. 【C语言】C语言中基础操作符详细讲解
  14. 基于ppg和fft神经网络的光学血压估计【翻译】
  15. 不同工资的男生睡前在想什么 vs 不同工资的女生睡前在想什么
  16. 关于element的日历组件改造为考勤页面
  17. 插件式换肤框架搭建 - 资源加载源码分析
  18. Linux的gre命令匹配数字,linux之grep命令和正则表达式练习
  19. .Net 中关于序列化和反序列化Json的方法
  20. 安装完QQ必须要删除掉的几个恐怖文件

热门文章

  1. mjExtention
  2. java压缩文件出现中文乱码问题
  3. Parse a document from a String
  4. 现代网络管理员必备技能
  5. 牛客 - 汉诺塔(思维+dp)
  6. CodeForces - 570D Tree Requests(树上启发式合并)
  7. CodeForces - 727D T-shirts Distribution(贪心)
  8. CodeForces - 553C Love Triangles(二分图)
  9. HDU - 1079 Calendar Game(博弈打表sg函数)
  10. POJ - 3254 Corn Fields(状压dp)