算法学习之剑指offer(五)
题目1
题目描述
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence==null||sequence.length==0)
return false;
return check(sequence,0,sequence.length-1);
}
public boolean check(int [] sequence,int start,int end) {
//单个节点的情况
if((end-start)==0)
return true;
int i=end;
//找到左右子树分界点
for(;i>=start;i--)
if(sequence[i]<sequence[end])
break;
if(start>i)//说明全是右子树
return true;
//检查左子树里是不是有不符合的
for(int j=start;j<=i;j++)
if(sequence[j]>=sequence[end])
return false;
//不断对左右子树递归检查
return check(sequence,start,i)&&check(sequence,i+1,end-1);
}
}
题目2
题目描述
第一遍结果:
import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
private ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null)
return listAll;
ArrayList<Integer> list = new ArrayList<Integer>();
doFindPath(root,list,target);
return listAll;
}
public void doFindPath(TreeNode root,ArrayList<Integer> list,int target) {
if(root==null)
return;
target -= root.val;
list.add(root.val);
if(root.left==null&&root.right==null&&target==0)
listAll.add(list);
doFindPath(root.left,new ArrayList<Integer>(list),target);
doFindPath(root.right,new ArrayList<Integer>(list),target);
}
}
第二次参考他人的代码为:
import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
private ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();
private ArrayList<Integer> list = new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null)
return listAll;
target -= root.val;
list.add(root.val);
if(root.left==null&&root.right==null&&target==0)
listAll.add(new ArrayList<Integer>(list));
FindPath(root.left,target);
FindPath(root.right,target);
list.remove(list.size()-1);
return listAll;
}
}
题目3
题目描述
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
if(pHead==null)
return null;
RandomListNode node = pHead;
while(node!=null){
RandomListNode new_node = new RandomListNode(node.label);
new_node.next = node.next;
node.next = new_node;
node = new_node.next;
}
node = pHead;
while(node!=null){
if(node.random!=null)
node.next.random = node.random.next;
node = node.next.next;
}
RandomListNode head = pHead.next;
RandomListNode cirNode = pHead.next;
node = pHead;
while(node!=null){
node.next = node.next.next;
if(cirNode.next!=null)
cirNode.next = cirNode.next.next;
node = node.next;
cirNode = cirNode.next;
}
return head;
}
}
题目4
题目描述
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null)
return null;
if(pRootOfTree.left==null&&pRootOfTree.right==null)
return pRootOfTree;
TreeNode left = Convert(pRootOfTree.left);
TreeNode p = left;
while(p!=null&&p.right!=null)
p=p.right;
if(left!=null){
p.right=pRootOfTree;
pRootOfTree.left=p;
}
TreeNode right = Convert(pRootOfTree.right);
if(right!=null){
pRootOfTree.right=right;
right.left = pRootOfTree;
}
if(left!=null)
return left;
else
return pRootOfTree;
}
}
题目5
题目描述
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
import java.util.ArrayList;
import java.util.*;
public class Solution {
ArrayList<String> list = new ArrayList<String>();
HashSet<String> hs = new HashSet<String>();
public ArrayList<String> Permutation(String str) {
if(str==null||str.length()==0)
return list;
char[] chars = str.toCharArray();
doPermutation(chars,0,str.length()-1);
list.addAll(hs);
Collections.sort(list);
return list;
}
public void doPermutation(char[] chars,int start,int end) {
if(start==end){
StringBuilder sb = new StringBuilder();
for(char c:chars){
sb.append(c);
}
hs.add(sb.toString());
}else{
for(int i=start;i<=end;i++){
swap(chars,start,i);
doPermutation(chars,start+1,end);
swap(chars,start,i);
}
}
}
public void swap(char[] chars,int a,int b){
char tmp = chars[a];
chars[a] = chars[b];
chars[b] = tmp;
}
}
题目6
题目描述
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array==null)
return 0;
sort(array,0,array.length-1);
int index = (array.length)/2;
int times=0;
for(int i=0;i<array.length;i++)
if(array[i]==array[index])
times++;
if(times>index)
return array[index];
else
return 0;
}
public void sort(int [] array,int start,int end) {
if(start>=end)
return ;
int p = partition(array,start,end);
sort(array,start,p-1);
sort(array,p+1,end);
}
public int partition(int [] array,int start,int end) {
int p = start;
for(int i=start+1;i<=end;i++){
if(array[start]>array[i]){
swap(array,++p,i);
}
}
swap(array,p,start);
return p;
}
public void swap(int[] data, int a, int b) {
int tmp = data[a];
data[a] = data[b];
data[b] = tmp;
}
}
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int n = array.length;
if (n == 0) return 0;
int num = array[0], count = 1;
for (int i = 1; i < n; i++) {
if (array[i] == num) count++;
else count--;
if (count == 0) {
num = array[i];
count = 1;
}
}
// Verifying
count = 0;
for (int i = 0; i < n; i++) {
if (array[i] == num) count++;
}
if (count * 2 > n) return num;
return 0;
}
}
算法学习之剑指offer(五)的更多相关文章
- 算法学习之剑指offer(十一)
一 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. import java.util.*; ...
- 算法学习之剑指offer(九)
一 题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). public class Solution ...
- 算法学习之剑指offer(十)
一 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3 ...
- 算法学习之剑指offer(八)
题目一 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没 ...
- 算法学习之剑指offer(六)
题目1 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. import java.util.*; public cl ...
- 算法学习之剑指offer(四)
题目1 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) /** public class TreeNode { int val = 0; Tree ...
- 算法学习之剑指offer(十二)
一 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩 ...
- 算法学习之剑指offer(七)
题目1 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P% ...
- 算法学习之剑指offer(三)
题目1 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在 ...
随机推荐
- Spring Boot2 系列教程(五)Spring Boot中的 yaml 配置
搞 Spring Boot 的小伙伴都知道,Spring Boot 中的配置文件有两种格式,properties 或者 yaml,一般情况下,两者可以随意使用,选择自己顺手的就行了,那么这两者完全一样 ...
- 干货 干货 2019阿里巴巴Android40道基本面试题
找工作还是需要大家不要经常,有我们干这一行的接触人本来就不多 难免看到面试官会紧张,主要是因为怕面试官问的问题到不上来,那时候不要着急 ,答不上了的千万不然胡扯一些,直接就给面试官说这块我还没接触到, ...
- JAVA父类的静态方法能否被子类重写?
静态: 在编译时所分配的内存会一直存在(不会被回收),直到程序退出内存才会释放这个空间,在实例化之前这个方法就已经存在于内存,跟类的对象没什么关系.子类中如果定义了相同名称的静态方法,并不会重写,而应 ...
- Nancy获取Request.Form的所有参数
Nancy是一个轻量级的webapi框架,在用Nancy框架的时候,我们经常要获取到接口的所有动态参数值, 但是Nancy的Request.Form不能够直接转成NameValueCollection ...
- DevExpress的PdfViewer添加工具栏实现PDF打开、预览、保存、打印
场景 Winform控件-DevExpress18下载安装注册以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...
- Winform中对ZedGraph的曲线标签进行设置,比如去掉标签边框
场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...
- [Leetcode] 第324题 摆动排序II
一.题目描述 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums ...
- Java StringTokenizer 类使用方法
Java StringTokenizer 属于 java.util 包,用于分隔字符串. StringTokenizer 构造方法: 1. StringTokenizer(String str) :构 ...
- Java匹马行天下之Java帝国的崛起(大结局)
Java匹马行天下之Java帝国的崛起大结局 前言: [博客*缘] 网络真情伴, 博客友谊连. 笑中藏泪暖中寒. 回想那些悲喜, 苦涩也缠绵. 往事难回首, 新篇染旧言. 世间多少梦能全. 感谢相牵, ...
- 打印方案之web打印
前言: 前一段时间在工作中,遇到需要通过打印实现对报表或者工作流清单等事情时,都需要运用到打印功能,那么 ,这个时候你会怎么处理? 在这里,我们可以通过最简单的方式实现web打印功能,简单易懂,方便快 ...