数字在升序 数组中出现的次数
统计一个数字在升序数组中出现的次数。
示例1
输入:[1,2,3,3,3,3,4,5],3
返回值:4
public class Solution { public int GetNumberOfK(int [] array , int k) { int a=Binary(array,k); int b=Binary(array,k+1); return b-a; } private int Binary(int [] n,int m) { int l=0; int h=n.length; while(l<h) { int mid=l+(h-l)/2; if(n[mid]>=m) h=mid; else l=mid+1; } return l; } }
二叉搜索树的第k小节点
给定一棵二叉搜索树,请找出其中的第k小的结点。
示例1
输入:{5,3,7,2,4,6,8},3
返回值:{4}
说明:按结点数值大小顺序第三小结点的值为4
/* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ //利用中序遍历 import java.util.Stack; public class Solution { TreeNode KthNode(TreeNode pRoot, int k) { if (pRoot == null || k <= 0 ) return null; int i = 1; Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode p = pRoot; while (p != null || !stack.isEmpty()) { while (p != null) { stack.push(p); p = p.left; } p = stack.pop(); if (i++ ==k) return p; p = p.right; } return null; } }
二叉树的深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
示例1
输入:{1,2,3,4,5,#,6,#,#,7}
返回值:4
/** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ //传统方法 import java.util.LinkedList; import java.util.Queue; public class Solution { public int TreeDepth(TreeNode root) { if(root==null) return 0; Queue<TreeNode> q=new LinkedList<>(); q.add(root); int count=0,depth=0,countnext=1; while(q.size()>0) { TreeNode t=q.poll(); count++; if(t.left!=null) q.add(t.left); if(t.right!=null) q.add(t.right); if(count==countnext) { count=0; countnext=q.size(); depth++; } } return depth; } } //利用递归 public class Solution { public int TreeDepth(TreeNode root) { if(root==null) return 0; int nleft=TreeDepth(root.left); int nright=TreeDepth(root.right); return nleft>nright?nleft+1:nright+1; } }
数组中只出现一次的两个数字
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
//num1,num2分别为长度为1的数组。传出参数 //将num1[0],num2[0]设置为返回结果 import java.util.Map; import java.util.HashMap; public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { Map<Integer,Integer> map= new HashMap<>(); for(int i:array) { if(map.containsKey(i)) map.remove(i); else map.put(i,i); } int c=0; for (Map.Entry<Integer, Integer> entry : map.entrySet()) { if(c==0) { num1[0]=entry.getKey(); c++; } else num2[0]=entry.getKey(); } } }
和为s的连续整数序列
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
返回值描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
示例1
输入:9
返回值:[[2,3,4],[4,5]]
import java.util.ArrayList; public class Solution { public ArrayList<ArrayList<Integer> > FindContinuousSequence(int ssum) { ArrayList<ArrayList<Integer>> b=new ArrayList<>(); int f=1,l=2; while(f<=ssum/2) { int sum=(f+l)*(l-f+1)/2; if(sum==ssum) { ArrayList<Integer> a=new ArrayList<>(); for(int j=f;j<=l;j++) a.add(j); b.add(a); f++; l++; } else if(sum<ssum) l++; else f++; } return b; } }
滑动窗口的最大值
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
窗口大于数组长度的时候,返回空
示例1
输入:[2,3,4,2,6,2,5,1],3
返回值:[4,4,6,6,6,5]
import java.util.ArrayList; public class Solution { public ArrayList<Integer> maxInWindows(int [] num, int size) { ArrayList<Integer> list=new ArrayList<>(); if(num==null) return null; if(size==0) return list; for(int i=0;i<=num.length-size;i++) { int max=num[i]; for(int j=1;j<size;j++) { if(num[i+j]>max) max=num[i+j]; } list.add(max); } return list; } }
扑克牌中的顺子
LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。
示例1
输入:[0,3,2,6,4]
返回值:true
public class Solution { public boolean isContinuous(int [] numbers) { if(numbers.length!=5) return false; int[] a=new int[14]; boolean flag=false; for(int i=0;i<14;i++) a[i]=0; for(int i=0;i<numbers.length;i++) a[numbers[i]]++; int min=0,max=0; for(int i=1;i<14;i++) { if(a[i]>1) return false; if(a[i]!=0 && min==0) min=i; if(a[i]!=0 && i>max) max=i; } if(max-min<5) flag=true; return flag; } }
圆圈中剩下的数
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)
如果没有小朋友,请返回-1
示例1
输入:5,3
返回值:3
public class Solution { public int LastRemaining_Solution(int n, int m) { if(n<1 || m<1) return -1; int i=-1,count=n,step=0; int[] a=new int[n]; while(count>0) { i++; if(i>=n) i=0; if(a[i]==-1) continue; step++; if(step==m) { a[i]=-1; step=0; count--; } } return i; } }