面试题36:数组中的逆序对
public class Test36 {
private static super T>> int merge(T[] a,T[] tmp,int leftPos,int rightPos,int rightEnd)
{
int leftEnd=rightPos-1;
int tmpPos=rightEnd;
int numEles=rightEnd-leftPos+1;
int count=0;
while (leftPos<=leftEnd&&rightPos<=rightEnd)
{
if (a[leftEnd].compareTo(a[rightEnd])<=0)
{
tmp[tmpPos--]=a[rightEnd--];
}else {
tmp[tmpPos--]=a[leftEnd--];
count+=rightEnd-rightPos+1;
}
}
while (leftPos<=leftEnd)
{
tmp[tmpPos--]=a[leftEnd--];
}
while (rightPos<=rightEnd)
{
tmp[tmpPos--]=a[rightEnd--];
}
for (int i = 0; i < numEles; i++,leftPos++)
{
a[leftPos]=tmp[leftPos];
}
return count;
}
private static super T>> int InversePairesCore(T[] a,T[] tmp,int left,int right)
{
int left_count=0;
int right_count=0;
int count=0;
if (leftint center=(left+right)/2;
left_count=InversePairesCore(a, tmp, left, center);
right_count=InversePairesCore(a, tmp,center+1, right);
count=merge(a, tmp, left, center+1, right);
}
return left_count+right_count+count;
}
public super T>>int InversePaires(T[] data) throws Exception{
if (data==null||data.length<=0) {
throw new Exception("invalid input");
}
T[] tmp=(T[]) new Comparable[data.length];
int count=InversePairesCore(data, tmp, 0, data.length-1);
return count;
}
public static void main(String[] args) throws Exception {
Integer[] data={7,5,6,4};
Test36 t=new Test36();
int count=t.InversePaires(data);
System.out.println(count);
}
}
面试题37:两个链表的第一个公共结点
public class Test37 {
private class Node{
private T obj;
private Node next = null;
Node(T obj) {
this.obj = obj;
}
}
private Node firstOne = null;
private Node firstTwo = null;
public Node getHeadOne(){
return firstOne;
}
public Node getHeadTwo(){
return firstTwo;
}
public Node insertFirstOne(T obj){
Node node = new Node(obj);
node.next = firstOne;
firstOne = node;
return node;
}
public void insertFirstTwo(T obj){
Node node = new Node(obj);
node.next = firstTwo;
firstTwo = node;
}
private int GetListLength(Node head){
int length=0;
Node node=head;
while (node!=null) {
length++;
node=node.next;
}
return length;
}
public Node FindFirstCommonNode(Node headOne,Node headTwo){
int nlength1=GetListLength(headOne);
int nlength2=GetListLength(headTwo);
int nlengthDif=nlength1-nlength2;
Node listHeadLong=headOne;
Node listHeadShort=headTwo;
if (nlength2>nlength1) {
nlengthDif=nlength2-nlength1;
listHeadLong=headTwo;
listHeadShort=headOne;
}
for (int i = 0; i < nlengthDif; i++) {
listHeadLong=listHeadLong.next;
}
while (listHeadLong!=null&&listHeadShort!=null&&listHeadLong!=listHeadShort) {
listHeadLong=listHeadLong.next;
listHeadShort=listHeadShort.next;
}
Node firstCommonNode=listHeadLong;
return firstCommonNode;
}
public static void main(String[] args) throws Exception {
int[] a={9,7,5,3,1};
int[] b={6,4,2};
Test37 t=new Test37();
Node crossNode=null;
for (int i = 0; i < a.length; i++)
{
if (i==1) {
crossNode=t.insertFirstOne(a[i]);//头插法
}else {
t.insertFirstOne(a[i]);
}
}
//链表为1->3->5->7->9
for (int i = 0; i < b.length; i++)
{
t.insertFirstTwo(b[i]);//头插法
}
//链表为2->4->6
Node tailNode=t.getHeadTwo();
while (tailNode.next!=null) {
tailNode=tailNode.next;
}
tailNode.next=crossNode;
//链表为 1->3->5->
// ->7->9
// 2->4->6->
Node firstCommonNode=t.FindFirstCommonNode(t.getHeadOne(), t.getHeadTwo());
System.out.println(firstCommonNode.obj);
}
}
面试题38:数字在排序数组中出现的次数
public class Test38 {
private int GetFirstK(int[] data,int k,int start,int end){
if (start>end) {
return -1;
}
int middleIndex=(start+end)/2;
int middleData=data[middleIndex];
if (middleData==k)
{
if ((middleIndex>0&&data[middleIndex-1]!=k)||middleIndex==0)
{
return middleIndex;
}else
{
end=middleIndex-1;
}
}else if(middleData>k)
{
end=middleIndex-1;
}else
{
start=middleIndex+1;
}
return GetFirstK(data, k, start, end);
}
private int GetLastK(int[] data,int k,int start,int end){
if (start>end) {
return -1;
}
int length=data.length;
int middleIndex=(start+end)/2;
int middleData=data[middleIndex];
if (middleData==k)
{
if ((middleIndex1&&data[middleIndex+1]!=k)||middleIndex==length-1)
{
return middleIndex;
}else
{
start=middleIndex+1;
}
}else if(middleData>k)
{
end=middleIndex-1;
}else
{
start=middleIndex+1;
}
return GetLastK(data, k, start, end);
}
public int getNumberOfK(int[] data,int k)
{
int number=0;
if (data!=null&&data.length>0)
{
int first=GetFirstK(data, k, 0, data.length-1);
int last=GetLastK(data, k, 0, data.length-1);
if (first>-1&&last>-1)
{
number=last-first+1;
}
}
return number;
}
public static void main(String[] args) {
int[] data={1,2,3,3,3,3,4,5};
Test38 t =new Test38();
int number=t.getNumberOfK(data, 3);
System.out.println(number);
}
}
面试题39:二叉树的深度
public class Test39{
private class Node {
public T value;
public Node lChild;
public Node rChild;
public Node(T value) {
this.value = value;
}
}
private class Depth {
public int height;
}
public Node root=null;
private int pos = 0;
public void creatBiTree(T[] value){
pos=0;
root=creatBiTree(root, value);
}
// 以node为根节点,创建一棵树,返回此根节点
private Node creatBiTree(Node node, T[] value) {
T t = value[pos];
pos++;
if (t == null) {
return null;
} else {
node = new Node(t);
node.lChild = creatBiTree(node.lChild, value);
node.rChild = creatBiTree(node.rChild, value);
}
return node;
}
public int TreeDepth(Node root){
if (root==null) {
return 0;
}
int nleft=TreeDepth(root.lChild);
int nright=TreeDepth(root.rChild);
return (nleft>nright)?(nleft+1):(nright+1);
}
//参数中携带信息 需要用对象类 不能用基本类型 c中可以用指针修改
private boolean IsBalanced(Node root,Depth pDepth)
{
if (root==null) {
pDepth.height=0;
return true;
}
Depth left=new Depth();
Depth right=new Depth();
if (IsBalanced(root.lChild, left)&&IsBalanced(root.rChild, right))
{
int diff=left.height-right.height;
if (diff<=1&&diff>=-1)
{
pDepth.height=1+(left.height>right.height?left.height:right.height);
return true;
}
}
return false;
}
public boolean IsBalanced(Node root){
Depth depth=new Depth();
return IsBalanced(root, depth);
}
public static void main(String[] args) {
Object[] a = { 1, 2, 4, null, null,5,7,null,null,null, 3, null,6,null, null};
Test39 t = new Test39();
t.creatBiTree(a);
int depth=t.TreeDepth(t.root);
boolean isBalanced=t.IsBalanced(t.root);
System.out.println(depth);
System.out.println(isBalanced);
}
}
面试题40:数组中只出现一次的数字
public class Test40 {
private class Number{
int intValue;
}
private Number number;
public void FindNumsAppearOnce(int[] data,Number num1,Number num2){
if (data==null||data.length<2) {
return;
}
int resultExclusiveOR=0;
for (int i = 0; i < data.length; i++) {
resultExclusiveOR^=data[i];
}
int indexOf1=FindFirstBitIs1(resultExclusiveOR);
num1.intValue=0;
num2.intValue=0;
for (int i = 0; i < data.length; i++) {
if (IsBit1(data[i], indexOf1)>0)
{
num1.intValue^=data[i];
}else
{
num2.intValue^=data[i];
}
}
}
private int FindFirstBitIs1(int num) {
int indexBit=0;
while (((num&1)==0)&&(indexBit>1;
indexBit++;
}
return indexBit;
}
private int IsBit1(int num,int indexBit){
num=num>>indexBit;
return (num&1);
}
public static void main(String[] args) {
int[] data={2,4,3,6,3,2,5,5};
Test40 t=new Test40();
//假设外部类叫Out,内部类叫In,那么我们可以使用Out.In in = new Out().new In()来实例化内部类的对象
Test40.Number num1=t.new Number();
Test40.Number num2=t.new Number();
t.FindNumsAppearOnce(data, num1, num2);
System.err.println(num1.intValue+","+num2.intValue);
}
}