剑指offer面试题 java解答6-10

面试题6:重建二叉树

public class test6 {
    private class Node<T> {
            public T value;
            public Node lChild=null;
            public Node rChild=null;
            public Node(T value) {
                this.value = value;
            }
          }
    public Node root;
    public Node construct(String preorder,String inorder,int length){
        Node root=new Node(preorder.charAt(0));
        int leftLen=0;
        int rightLen=0;
        //求取左子树长度
        for (int i = 0; i <length; i++) 
        {
            if (preorder.charAt(0)==inorder.charAt(i)) 
            {
                break;
            }
            if (preorder.charAt(0)!=inorder.charAt(i)) 
            {
                leftLen++;
            }
        }
        //右子树长度
        rightLen=length-leftLen-1;
        if (leftLen>0) {
            root.lChild=construct(preorder.substring(1,leftLen+1), inorder.substring(0, leftLen),leftLen);
        }
        if (rightLen>0) {
            root.rChild=construct(preorder.substring(leftLen+1), inorder.substring(leftLen+1),rightLen);
        }
        return root;
    }    
    public static void main(String[] args) {
        String preorder="12473568";
        String inorder="47215386";
        test6 t=new test6();
        Node head=t.construct(preorder, inorder,8);     
    }
}

面试题7:用两个栈实现队列

import java.util.Stack;
public class test7 {
    private Stack stack1;
    private Stack stack2;
    public test7(){
        stack1=new Stack();
        stack2=new Stack();
    }
    public <T> void addTail(T value)
    {
        stack1.push(value);
    }
    public <T> T deleteHead(){
        if (stack2.size()<=0) 
        {
            while (stack1.size()>0) 
            {
                T tmp=(T) stack1.pop();
                stack2.push(tmp);
            }
        }
        return (T) stack2.pop();        
    }
    public static void main(String[] args) {
        int[] a={1,2,3,4,5};
        test7 t=new test7();
        for (int i = 0; i < a.length; i++) 
        {
            t.addTail(a[i]);
        }
        for (int i = 0; i < a.length; i++) 
        {
            System.out.println(t.deleteHead());
        }
    }
}

面试题8:旋转数组的最小数字

//二分法
public class test8 {
    public int Min(int[] a){
        int left=0;
        int right=a.length-1;
        int mid=0;
        while (left<right)
        {
            if (right-left==1) 
            {
                mid=right;
                break;
            }
            mid=(left+right)/2;
            if (a[left]==a[mid]&&a[mid]==a[right])
            {
                return MinInOrder(a,left,right);
            }
            if (a[mid]>=a[left]) 
            {
                left=mid;
            }
            if (a[mid]<=a[right]) 
            {
                right=mid;
            }
        }
        return a[mid];
    }
    private int MinInOrder(int[] a, int left, int right) {
        int min=a[left];
        for (int i = left+1; i <=right; i++)
        {
            if (min>a[i]) 
            {
                min=a[i];
            }
        }
        return min;
    }
    public static void main(String[] args) {
        int[] a={3,4,5,1,2};
        test8 t=new test8();
        System.out.println(t.Min(a));
    }
}

面试题9:斐波那契数列

public class test9 {
    public long Fabonacci(int n) throws Exception {
        if (n<0) 
        {
            throw new Exception("n is invalid");
        }
        int[] result={0,1};
        if (n<2) {
            return result[n];
        }
        long fabonacciOne=0;
        long fabanacciTwo=1;
        long fabanacciNow=0;
        for (int i = 2; i <= n; i++) {
            fabanacciNow=fabonacciOne+fabanacciTwo;
            fabonacciOne=fabanacciTwo;
            fabanacciTwo=fabanacciNow;
        }
        return fabanacciNow;        
    }
    public static void main(String[] args) throws Exception {
        test9 t=new test9();
        System.out.println(t.Fabonacci(5));
    }
}

面试题10:二进制中1的个数

public class Test10 {
    public int NumberOf1(int n)
    {
        int flag=1;
        int num=0;
        while (flag>0) 
        {
            if ((n&flag)>0) 
            {
                num++;
            }
            flag=flag<<1;
        }
        return num;
    }
    public static void main(String[] args) {
        Test10 t=new Test10();
        System.out.println(t.NumberOf1(7));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值