《剑指offer》算法题第二天
今日题目(分别对应剑指书3~9题):
- 数组中重复的数字
- 二维数组中的查找
- 替换空格
- 从尾到头打印链表
- 重建二叉树
- 二叉树的下一个节点
- 用两个栈实现队列
今日重点为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》算法题第二天的更多相关文章
- 剑指offer算法题
数组中只出现一次的数字(一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字): 解法在于位运算中的异或,直接异或可以得到这两个数的异或,按照最后的有效数字位可以 ...
- 剑指offer算法总结
剑指offer算法学习总结 节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行 ...
- 剑指Offer编程题1——二维数组中的查找
剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...
- 剑指Offer——算法复杂度中的O(logN)底数是多少
剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...
- 剑指 offer 第一题: 二维数组中的查找
打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣
- 剑指Offer编程题2——替换空格
剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...
- 《剑指offer》(第二版)Java实现
Github链接: <剑指offer>(第二版)Java实现 欢迎star!
- 剑指offer编程题66道题 36-66
36.两个链表的第一个公共节点 题目描述 输入两个链表,找出它们的第一个公共结点. 1.具有重合节点的两个链表是一个Y字性,用两个堆栈放这两个链表,从尾部开始遍历,直到遍历到最后一个重合节点. 这种算 ...
- 牛客网剑指offer刷题总结
二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...
- LeetCode剑指Offer刷题总结(一)
LeetCode过程中值得反思的细节 以下题号均指LeetCode剑指offer题库中的题号 本文章将每周定期更新,当内容达到10题左右时将会开下一节. 二维数组越界问题04 public stati ...
随机推荐
- 利用微信web开发者工具调试企业微信页面
1.只有企业号的管理员才能调试. 2.勾选企业号的开发者工具(具体位置见下图,这个入口位置总是在变,一般来说,找到”微工作台“就能找到了) 3.下载web开发者工具 https://developer ...
- (5.4)mysql高可用系列——MySQL异步复制(实践)
关键词:mysql复制,mysql异步复制,mysql传统异步复制 [1]实验环境 操作系统:CentOS linux 7.5 数据库版本:5.7.24 数据库架构:主从复制,主库用于生产,从库用于数 ...
- 检测Python程序本身是否已经在运行
为runner.py实现一个函数,检测是否有其他的runner.py进程在正在执行? 除主要用到os模块,还用到了第三方模块psutil
- SKCTF管理系统
一开始是一个简洁风的登录界面 康康注册界面 嗯...也是很简洁风呢. 那让我们来查看元素(fn+f12) 没有什么有flag的迹象呢! 那我们试一下注册一个账号 这时候我们已经有解题的线索了: 获得管 ...
- expdp使用
原文:https://blog.csdn.net/zftang/article/details/6387325 ORACLE EXPDP命令使用详细相关参数以及导出示例: 1. DIRECTORY指定 ...
- 十大经典排序算法(Python,Java实现)
参照:https://www.cnblogs.com/wuxinyan/p/8615127.html https://www.cnblogs.com/onepixel/articles/7674659 ...
- spring boot 配置文件动态更新原理 以Nacos为例
配置文件的动态更新 通常获取配置文件的方式 1, @Value 2. @ConfigurationProperties(Prefix) 如果是在运行时要动态更新的话, 第一种方式要在bean上加@Re ...
- Git复习(十三)之git revert用法及与git reset区别
git revert用法以及与git reset的区别 git revert用法 git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销 作为一 ...
- 02Spring基于xml的IOC配置--实例化Bean的三种方式
maven依赖 <dependencies> <!--IOC相关依赖--> <dependency> <groupId>org.springframew ...
- 07 Python中zip(),map(),filter(),reduce()用法
一. zip() zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表. 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 ...