算法学习之剑指offer(一)
2018-01-17 17:49
267 查看
题目一:
题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路1:遍历每一行,然后对每一行进行二分查找,复杂度为n*logn
public class Solution { public boolean Find(int target, int [][] array) { for(int i=0;i<array.length;i++) { int min=0; int max = array[i].length-1; while(min<=max){ int mid = (min+max)/2; if(target>array[i][mid]) min=mid+1; else if(target<array[i][mid]) max=mid-1; else return true; } } return false; } }
思路二:
选取二维数组的一个角,比如选左下(不能选左上和右下,会产生岔路),target大于角则往右移一个(右边递增),target小于角则往上移一个(上面递减),不断如此就可以找到了
public class Solution { public boolean Find(int target, int [][] array) { int row=0; int col=array.length-1; while(col>=0&&row<array[col].length){ if(target<array[col][row]) col--; else if(target>array[col][row]) row++; else return true; } return false; } }
题目二:
题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。public class Solution { public String replaceSpace(StringBuffer str) { StringBuffer stb_new = new StringBuffer(); for(int i=0;i<str.length();i++){ char c = str.charAt(i); if(c==' ') stb_new.append("%20"); else stb_new.append(c); } return stb_new.toString(); } }
题目三:
题目描述
输入一个链表,从尾到头打印链表每个节点的值。/** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int val) { * this.val = val; * } * } * */ import java.util.ArrayList; public class Solution { ArrayList<Integer> list = new ArrayList<Integer>(); public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { if(listNode!=null) { printListFromTailToHead(listNode.next); list.add(listNode.val); } return list; } }
题目四:
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。import java.util.*; /** * 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) { if(pre==null||in==null||pre.length==0||in.length==0) return null; TreeNode node = new TreeNode(pre[0]); //pre[0]是根节点 注意!1.通过遍历可以知道 中序的in数组里 i所处的位置,左边是左子树 右边是右子树 //2.通过此时的i可以得出左右子树个数,就可以得出pre前序遍历中哪些是左子树的前序遍历 for(int i=0;i<in.length;i++){ if(pre[0]==in[i]){ node.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1), A 4000 rrays.copyOfRange(in,0,i)); node.right=reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length), Arrays.copyOfRange(in,i+1,in.length)); } } return node; } }
相关文章推荐
- 浅析时钟向量算法
- 什么品类适合千人千面?
- 内容处理和分发中的算法应用探究
- 当“心法”遇见“算法”
- 面经干货:技术转产品,我成功收割网易/百度云计算产品经理offer
- 笔试整理 | 产品经理校招笔试39题
- 算法系列——算法入门之递归分而治之思想的实现
- 算法系列——JavaScript快速排序思想实现
- 算法系列——JavaScript中广度优先搜索思想实现
- 图解算法系列之插入排序(优化版)
- 数据结构之scala 实现链表
- 数据结构之scala 实现链表
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字