剑指offer(一)

1.在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

方法一:普通方法,全部遍历一遍

public class Solution {

    public boolean Find(int target, int[][] array) 

             for(int i=0;i

                 for(int j=0;j

                     if(target==array[i][j])

                        return true;

                 }

             }

             return false;

    }

}

方法二:利用题目要求从左下角开始遍历,若是比左下角数字大则在右边查找,否则向上查找

public class Solution {

    public boolean Find(int target, int [][] array){

        int row = array.length-1;

        int col = 0;

        while(col=0){

            if(target==array[row][col]){

                return true;

            }

            else if(target>array[row][col]){

                col++;

            }

            else{

                row--;

            }

        }

      return false;

    }

}

方法三:二分查找

public class Solution {

    public boolean Find(int target, int [][] array){

        for(int i=0;i

            int left = 0;

            int right = array[i].length-1;

            while(left<=right){

                int flag = (left+right)/2;

                if(target>array[i][flag]){

                    left=flag+1;

                }

                else if(target

                    right=flag-1;

                else

                    return true;

            }

        }

        return false;

    }

}

2.请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

方法一:将StringBuffer转为String类型再使用replace方法

public class Solution {

    public String replaceSpace(StringBuffer str) {

    return str.toString().replaceAll("\\s","%20");

    }

}

方法二:遍历加入到新的StringBuffer对象中

public class Solution {

    public String replaceSpace(StringBuffer str) {

    String s = str.toString();

        char[] s1 = s.toCharArray();

        StringBuffer s2 = new StringBuffer();

        for(int i=0;i

            if(s1[i]==' '){

                s2.append("%20");

            }

            else{

                s2.append(s1[i]);

            }

        }

        return s2.toString();

    }

}

方法三:遍历在原对象中操作

public class Solution {

    public String replaceSpace(StringBuffer str) {


        for(int i=0;i

            if(str.charAt(i)==' '){

                str.deleteCharAt(i);

                str.insert(i,"%20");

            }

        }

        return str.toString();

    }

}

3.输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

方法一:利用递归将链表中的数据从尾到头加入到新的链表

import java.util.ArrayList;

public class Solution {

    public ArrayList printListFromTailToHead(ListNode listNode) {

        ArrayList arraylist = new ArrayList();

        if(listNode!=null){

            this.printListFromTailToHead(listNode.next);

            arraylist.add(listNode.val);

        }

        return arraylist; 

    }

}

方法二:

import java.util.ArrayList;

public class Solution {


    public ArrayList printListFromTailToHead(ListNode listNode) {

        ArrayList arraylist = new ArrayList();

        ListNode pre=null;

        ListNode next=null;

        while(listNode!=null){

            next=listNode.next;

            listNode.next = pre;

            pre=listNode;

            listNode= next;

        }

        while(pre!=null){

            arraylist.add(pre.val);

            pre=pre.next;

        }

        return arraylist;

    }

}

4.大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。

n<=39

方法一:递归

public class Solution {

    public int Fibonacci(int n) {

        if(n<=0) return 0;

        if(n==1||n==2)

            return 1;

        return Fibonacci(n-1)+Fibonacci(n-2);

    }

}

你可能感兴趣的:(剑指offer(一))