Java--剑指offer(8)
36.输入两个链表,找出它们的第一个公共结点。
解题思路:这里主要是把两个链表的节点都放入两个栈中,这样就可以按照出栈的方式来比较节点,因为单链表只要是有相同的节点,那么之后的节点也都是一样的,所以如果出栈的节点不相同的话就可以返回之前保存的commonNode变量,这么变量的值就是第一个共同的节点。
import java.util.Stack;
/*
public class ListNode {
int val;
ListNode next = null; ListNode(int val) {
this.val = val;
}
}*/ public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if(pHead1 == null || pHead2 == null)
return null; ListNode commonNode = null;
Stack<ListNode> s1 = new Stack<ListNode>();
Stack<ListNode> s2 = new Stack<ListNode>(); s1.push(pHead1);
s2.push(pHead2); ListNode p1 = pHead1;
ListNode p2 = pHead2;
while(p1.next != null){
s1.push(p1.next);
p1 = p1.next;
}
while(p2.next != null){
s2.push(p2.next);
p2 = p2.next;
}
while(s1.peek() == s2.peek()){
commonNode = s1.peek();
if(s1.peek() != null)
s1.pop();
if(s2.peek() != null)
s2.pop();
//如果s1或者s2为空就直接跳出循环
if(s1.empty() || s2.empty())
break;
} return commonNode;
}
}
37.统计一个数字在排序数组中出现的次数。
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int len = array.length;
int first = -1;
int last = -1;
int num = 0; for(int i = 0; i < len; i++){
if(array[i] == k){
first = i;
break;
}
}
for(int i = len-1; i >= 0; i--){
if(array[i] == k){
last = i;
break;
}
} //如果first和last为-1的话,证明数组中没有和k相同的
if(first != -1 && last != -1){
num = last - first +1;
} else{
num = 0;
} return num;
}
}
38.输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
};*/
public class Solution {
public int TreeDepth(TreeNode pRoot)
{
if(pRoot == null)
return 0; int nLeft = TreeDepth(pRoot.left);
int nRight = TreeDepth(pRoot.right); return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
}
}
39.输入一棵二叉树,判断该二叉树是否是平衡二叉树。
这一种方法使用了递归的方式,虽然十分简洁,但是节点会被重复遍历多次,所以时间效率不高。
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
//空二叉树也是平衡二叉树
if(root == null)
return true; int left = TreeDepth(root.left);
int right = TreeDepth(root.right); int diff = left - right;
if(diff > 1 || diff < -1)
return false; return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
} public int TreeDepth(TreeNode pRoot)
{
if(pRoot == null)
return 0; int nLeft = TreeDepth(pRoot.left);
int nRight = TreeDepth(pRoot.right); return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
}
}
40.一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int length = array.length;
if(array==null ||length<2)
return ;
int resultExclusiveOR = 0;
for(int i=0;i<length;i++)
resultExclusiveOR ^= array[i]; int indexOf1 = findFirstBitIs1(resultExclusiveOR);
for(int i=0;i<length;i++){
if(isBit1(array[i], indexOf1))
num1[0]^=array[i];
else
num2[0]^=array[i];
}
}
public int findFirstBitIs1(int num){
int indexBit = 0;
while(((num & 1)==0) && (indexBit)<8*4){
num = num >> 1;
++indexBit;
}
return indexBit;
}
public boolean isBit1(int num,int indexBit){
num = num >> indexBit;
return (num & 1) == 1;
}
}
Java--剑指offer(8)的更多相关文章
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指offer编程题Java实现——面试题5从头到尾打印链表
题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...
- 剑指offer面试题-Java版-持续更新
最近在用Java刷剑指offer(第二版)的面试题.书中原题的代码采用C++编写,有些题的初衷是为了考察C++的指针.模板等特性,这些题使用Java编写有些不合适.但多数题还是考察通用的算法.数据结构 ...
- 《剑指offer》全部题目-含Java实现
1.二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. publi ...
- 剑指Offer——Java实现栈和队列的互模拟操作
剑指Offer--Java实现栈和队列的互模拟操作 栈模拟队列 题目:JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 思路:其实就是把队列正常入 ...
- 剑指Offer——知识点储备-故障检测、性能调优与Java类加载机制
剑指Offer--知识点储备-故障检测.性能调优与Java类加载机制 故障检测.性能调优 用什么工具可以查出内存泄露 (1)MerroyAnalyzer:一个功能丰富的java堆转储文件分析工具,可以 ...
- 剑指Offer——知识点储备-Java基础
剑指Offer--知识点储备-Java基础 网址来源: http://www.nowcoder.com/discuss/5949?type=0&order=0&pos=4&pa ...
- 剑指offer面试题5 从头到尾打印链表(java)
注:(1)这里体现了java数据结构与C语言的不同之处 (2)栈的操作直接利用stack进行 package com.xsf.SordForOffer; import java.util.Stack; ...
- 剑指offer面试题4 替换空格(java)
注:利用java中stringBuilder,append,length方法很方便的解决字符串问题 /* * 剑指offer 替换空格 * xsf * */ /*开始替换空格的函数,length为原数 ...
- 剑指offer面试题6 重建二叉树(java)
注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 package com.xsf.SordF ...
随机推荐
- ubuntu编译最新版本WebKit
好久都没更新webkit 源码在ubuntu上编译了,网上搜了一下,基本上都是早期编译的webkit版本.可能是大家都去搞高大上的谷歌浏览器了吧. 今天就以ubuntu14.04版本作为编译环境来讲讲 ...
- Nagios 自定义插件与安装使用之监控dead datanodes
现在我使用nagios来监控hadoop的核心进程,rm,nm,dn,nn,zkfc,jn,zk等,但是有时候进程虽然还在,但是日志不刷新,web ui上可以看到有些datanodes节点已经变为de ...
- Vim 命令整理
1. 文件命令 2. 模式切换 3. 移动命令 4. 书签命令 5. 修改命令 6. 可视化操作 7. 区域选择 8. 宏命令 9. 分屏 10. 系统设置命令 1. 文件命令 [:]开始的命令需要输 ...
- 谈谈 Google 的 Test Certified
转载请联系作者,谢谢! 本文简单介绍下Google的Test Certified. Test Certified(后文简称TC)是Google内部的一个认证项目,在8年的时间里取得了多个里程碑,有17 ...
- [转] 如何设置Eclipse的上网代理
from: http://blog.csdn.net/qq635785620/article/details/8191799 不同版本的eclipse有不同的设置方法 方式一: 默认的Eclips ...
- 使用exp进行SQL报错注入
0x01 前言概述 好消息好消息-作者又在MySQL中发现了一个Double型数据溢出.如果你想了解利用溢出来注出数据,你可以读一下作者之前发的博文:BIGINT Overflow Error bas ...
- Android ART运行时与Dalvik虚拟机
这几天在做一个项目时需要在Android中使用OSGi框架(Apache Felix),于是在一个android 4.4.2 版本系统的某品牌的平板上实验. 实验内容很简单:把felix包里的feli ...
- Android应用程序(APK)的编译打包过程
(9878) (7) 现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统.自动生成发布文件等等.这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的 ...
- http协议(三)几种数据传输方式
说说http协议的一些特点: 1)无状态 http协议是一种自身不对请求和响应之间的通信状态进行保存的协议,即无状态协议. 这种设置的好处是:更快的处理更多的请求事务,确保协议的可伸缩性 不过随着we ...
- AngularJs 1.5 $location获取url参数
地址:http://localhost/waservice.html?id=17 获取参数id的值 app.config(['$locationProvider', function ($locati ...