剑指offer面试题 java解答1-5

面试题1:赋值运算符函数
Java中不能重载运算符(C++可以)
String 类的“+”是通过StringBuidler的append追加实现的。
可以重写自定义类的toString()方法,对象相加时会调用toString()的方法。toString()是Object类具有的方法,而所有的类都继承自Object,所以所有的对象都有这个方法。
面试题2:实现Singleton模式

可行的解法1:双检测机制
    public class Singleton {  
    private Singleton() {}  
    private static Singleton instance=null;  
    //静态工厂方法   
    public static Singleton getInstance() {  
         if (instance == null) {    
                //加上了同步锁和双重检验机制
            synchronized (Singleton.class) {    
               if (instance == null) {    
                  instance = new Singleton();   
               }    
            }
         }    
        return single;  
    }  
}
推荐解法1:静态内部类
public class Singleton {   
    private static class SingletonHolder {    
       private static final Singleton instance = new Singleton();    
    }    
    private Singleton (){}    
    public static final Singleton getInstance() {    
//第一次调用getInstance,涉及到了SingletonHolder的引用,内部静态类的实例才会真正装载
       return SingletonHolder.instance;    
    }    
}
推荐解法2:在类创建的同时就实例化 singleTon
public class Singleton {  
    private Singleton() {}  
    private static final Singleton singleton = new Singleton();  
    //静态工厂方法   
    public static Singleton getInstance() {  
        return singleton;  
    }  
}

面试题3:二维数组中的查找


public class test3 {

    public boolean find(int[][] matrix,int value){
        boolean found=false;
        int rows=matrix.length;//行数
        if (matrix!=null) {
            int row=0;
            int column=matrix[0].length-1;
            while (row<rows&&column>=0) 
            {
                if (matrix[row][column]==value) 
                {
                    found=true;
                    break;
                }
                else if(matrix[row][column]<value)
                {
                    row++;
                }
                else if(matrix[row][column]>value)
                {
                    column--;
                }
            }   
        }
        return found;
    }
    public static void main(String[] args) {
        int[][] a=
            {
                {1,2,8,9},
                {2,4,9,12},
                {4,7,10,13},
                {6,8,11,15}
            };
        boolean found=new test3().find(a, 7);
        System.out.println(found);
    }

}

面试题4:替换空格

public class test4 {
    public String replaceBlank(String s){
        int len=0;
        char[] target;
        char[] original=s.toCharArray();
        for (int i = 0; i < original.length; i++) 
        {
            if (original[i]==' ')
            {
                len++;
            }
        }
        len=original.length+len*2;
        target=new char[len];
        int j=0;
        for (int i = 0; i < original.length; i++) 
        {
            if (original[i]==' ') 
            {
                target[j]='%';
                target[++j]='2';
                target[++j]='0';
                j++;
            }else 
            {
                target[j]=original[i];
                j++;
            }
        }
        return new String(target);//String类的构造函数 可以直接将Char数组转化为字符串      
    }
//  public String replaceBlank(String s){
//      return s.replace(" ", "%20");//利用String类的replace函数 基于正则表达式
//  }
    public static void main(String[] args) {
        String s="we are happy!";
        String v=new test4().replaceBlank(s);
        System.out.println(v);
    }
}

面试题5:从尾到头打印链表

public class test5{
    private class Node<T>{
        T valueT=null;
        Node next=null;
        public Node(T valueT) {
            this.valueT = valueT;
        }
    }
    private Node head=null;
    public Node getHeadNode(){
        return head;
    }
    public <T> void insertTail(T value){
        Node nextNode=null;
        if (head==null) {
            head=new Node(value);
        }else {
            nextNode=head;
            while (nextNode.next!=null) 
            {
                nextNode=nextNode.next;
            }
            nextNode.next=new Node(value);
        }
    }
    /**
     * @param head 头结点 
     * 利用递归实现逆向输出
     */
    public void reversePrint(Node head){
        if (head!=null) 
        {
            if (head.next!=null) 
            {
                reversePrint(head.next);
            }
            System.out.println(head.valueT);
        }       
    }
    public static void main(String[] args) {
        int[] a={1,2,3,4,5,6,7};
        test5 t=new test5();
        for (int i = 0; i < a.length; i++) {
            t.insertTail(a[i]);
        }
        t.reversePrint(t.getHeadNode());
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值