今日题目(分别对应剑指书3~9题):

  1. 数组中重复的数字
  2. 二维数组中的查找
  3. 替换空格
  4. 从尾到头打印链表
  5. 重建二叉树
  6. 二叉树的下一个节点
  7. 用两个栈实现队列

今日重点为1,2,5,6,后面会有详细的思路解析,现在先来简单地提一下其他题目:

3. 替换空格:

题目将一个句子中的空格转化为“%20”,为使时间复杂度达到O(n),采用从后往前遍历字符串的方法,即先遍历一遍字符串记录空格的个数,以此计算出转化完之后字符串新的长度,重新设定字符串长度之后,再从后往前逐字符修改字符串。

4. 从尾到头打印链表:

比较简单,可采用栈遍历链表,之后打印,也可以利用递归的方式。在这边博主建议大家要熟悉一下链表的各种操作,如翻转连表等。

7. 用两个栈实现队列:

一个栈作为入口,另一个栈作为出口,当出口栈空时,将入口栈的内容放进出口栈内,另外注意判断栈空的情况。

接下来是今天的重点内容:

1. 数组中重复的数字

题目描述:
在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

本题在leetcode中有相似的题目,为287. Find the Duplicate Number,但是稍微有一点不一样的是这题还需要判断是否有重复的数字,因此使用floyd判圈法就显得没那么理想。

思路:从头到尾依次骚面这个数组中的每个数字,当扫描到下标为i的数字时,首先比较这个数字(用m表示)是不是等于i。如果是,则接着扫描下一个数字;如果不是,则再拿他和第m个数字进行比较。如果他和第m个数字相等,就找到了一个重复的数字;如果不等,就把第i个数字和第m个数字交换。接下来重复这个比较、交换的过程,直到我们发现一个重复的数字。

代码如下:

 public class Solution {
// Parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication: (Output) the duplicated number in the array number,length of duplication array is 1,so using duplication[0] = ? in implementation;
// Here duplication like pointor in C/C++, duplication[0] equal *duplication in C/C++
// 这里要特别注意~返回任意重复的一个,赋值duplication[0]
// Return value: true if the input is valid, and there are some duplications in the array number
// otherwise false
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(length <= 1) return false;
for(int i = 0; i < length; i++){
while(numbers[i] != i){
if(numbers[i] == numbers[numbers[i]]){
duplication[0] = numbers[i];
return true;
}
int swap = numbers[numbers[i]];
numbers[numbers[i]] = numbers[i];
numbers[i] = swap;
}
}
return false;
}
}

2. 二维数组中的查找

题目描述:
在一个二维数组中每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个证书,判断数组中是否含有该整数。 思路:
首先选取数组中右上角的数字。如果该数字等于要查找的数字,则查找过程结束;如果该数字大于要查找的数字,则剔除这个数字所在的行。也就是说,如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每一步都可以缩小查找的范围,直到找到要查找的数字,或者查找范围为空。

代码如下:

 public class Solution {
public boolean Find(int target, int [][] array) {
int r = array.length;
if(r == 0) return false;
int c = array[0].length;
if(c == 0) return false; int row = 0, col = c-1;
while(row < r && col >= 0){
if(array[row][col] == target)
return true;
else if(array[row][col] > target)
col--;
else
row++;
}
return false;
}
}

5. 重建二叉树

题目描述:
输入二叉树的前序和中序遍历序列,构造二叉树。 思路:
利用前序和中序遍历序列的特点,每次找到根节点及其左右子树的节点,递归地建立二叉树。

这类型的题目在leetcode上有两题:

105. Construct Binary Tree from Preorder and Inorder Traversal

106. Construct Binary Tree from Inorder and Postorder Traversal

都是利用了遍历序列的特点来构造二叉树。

代码如下:

 /**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
return constructTree(pre,0,pre.length-1,in,0,in.length-1);
}
public TreeNode constructTree(int[] pre,int preStart,int preEnd,
int[] in,int inStart,int inEnd){
if(preStart > preEnd || inStart > inEnd)
return null;
TreeNode root = new TreeNode(pre[preStart]);
int r_index = inStart;
while(in[r_index] != root.val)
r_index++;
root.left = constructTree(pre,preStart+1,preStart+r_index-inStart,
in,inStart,r_index-1);
root.right = constructTree(pre,preStart+r_index-inStart+1,preEnd,
in,r_index+1,inEnd);
return root;
}
}

6. 二叉树的下一个节点

题目描述:
给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左右孩子的指针外,还有一个指向父节点的指针。 思路:
根据中序遍历的特点,如果一个节点有右孩子,那么它的下一个节点就是它的右子树中的最左子节点。如果没有右子树,那么下一个节点就是这个节点的祖先节点中,离它最近的第一个身为左孩子的节点的父节点。

其实这题的思路并不难,放到重点来的原因是博主在看到这题的时候并没有第一时间反应出这个思路,所以拿来反思反思。。。

代码如下:

 /*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null; TreeLinkNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
if(pNode.right != null){
TreeLinkNode p = pNode.right;
while(p.left != null)
p = p.left;
return p;
}else{
TreeLinkNode p = pNode;
while(p.next != null && p == p.next.right){
p = p.next;
}
return p==null?null:p.next;
}
}
}

《剑指offer》算法题第二天的更多相关文章

  1. 剑指offer算法题

    数组中只出现一次的数字(一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字): 解法在于位运算中的异或,直接异或可以得到这两个数的异或,按照最后的有效数字位可以 ...

  2. 剑指offer算法总结

    剑指offer算法学习总结 节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行 ...

  3. 剑指Offer编程题1——二维数组中的查找

    剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...

  4. 剑指Offer——算法复杂度中的O(logN)底数是多少

    剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...

  5. 剑指 offer 第一题: 二维数组中的查找

    打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣

  6. 剑指Offer编程题2——替换空格

    剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...

  7. 《剑指offer》(第二版)Java实现

    Github链接: <剑指offer>(第二版)Java实现 欢迎star!

  8. 剑指offer编程题66道题 36-66

    36.两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点. 1.具有重合节点的两个链表是一个Y字性,用两个堆栈放这两个链表,从尾部开始遍历,直到遍历到最后一个重合节点. 这种算 ...

  9. 牛客网剑指offer刷题总结

    二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...

  10. LeetCode剑指Offer刷题总结(一)

    LeetCode过程中值得反思的细节 以下题号均指LeetCode剑指offer题库中的题号 本文章将每周定期更新,当内容达到10题左右时将会开下一节. 二维数组越界问题04 public stati ...

随机推荐

  1. 同sql server不同database间的数据访问

    虽未经测试,但是应该是登陆名同时具有此2数据库访问权限啦. select * from [basename].dbo.[tablename] done.

  2. windows 安装 celery 避坑指南,看这篇就够了

  3. L2-014. 列车调度(Dilworth定理)

    火车站的列车调度铁轨的结构如下图所示. Figure 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选择任意一条轨道进入,最后从出口 ...

  4. js文件的框架

    Ext.define("BeidaSoft.SFJCGL.rcjwgl.bdgl.BdglGrid", { extend : "BeidaSoft.XTGL.base.Q ...

  5. Tomcat 7 自动加载类及检测文件变动原理

    在一般的 web 应用开发里通常会使用开发工具(如 Eclipse.IntelJ )集成 tomcat ,这样可以将 web 工程项目直接发布到 tomcat 中,然后一键启动.经常遇到的一种情况是直 ...

  6. 07 Python之协程

    协程: 协程是一种用户态的轻量级线程, 即协程是由用户程序自己控制调度的 1.Greenlet import time # import greenlet from greenlet import g ...

  7. python之排序(sort/sorted)

    大家都知道,python排序有内置的排序函数 sort() 和 高阶函数sorted() .但是它们有什么区别呢? 让我们先从这个函数的定义说起: sorted():该函数第一个参数iterable为 ...

  8. render:h => h(App) ----render函数

    转载其他博客1 new Vue({ 2 3 router, 4 store, 5 //components: { App } vue1.0的写法 6 render: h => h(App) vu ...

  9. Ubuntu 18.04 LTS 64位Linux搭建Kubernetes 1.15.3并join子节点的完整过程

    1.软件准备 1.1.Ubuntu系统安装 https://ubuntu.com/download#download ubuntu系统需要设置用户,root默认为系统的账户不能被用户设置且每一次开机都 ...

  10. 利用druid sql parser搞一些事情

    在最近的项目开发中,有这样一个需求,就是给定一个查询的sql,在where语句中添加几个条件语句.刚开始想的是,是否能用正则去做这个事情呢?其实不用语法树还是有一点困难的. 经过一系列google,看 ...