算法学习之剑指offer(一)

题目一:

题目描述

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


思路1:遍历每一行,然后对每一行进行二分查找,复杂度为n*logn

public class Solution {
    public boolean Find(int target, int [][] array) {
		
        for(int i=0;i<array.length;i++)
        {
            int min=0;
            int max = array[i].length-1;
            
            while(min<=max){
                int mid = (min+max)/2;
                if(target>array[i][mid])
                    min=mid+1;
                else if(target<array[i][mid])
                    max=mid-1;
                else
                    return true;
            }
        }
        return false;
        
    }
}
思路二:

选取二维数组的一个角,比如选左下(不能选左上和右下,会产生岔路),target大于角则往右移一个(右边递增),target小于角则往上移一个(上面递减),不断如此就可以找到了

public class Solution {
    public boolean Find(int target, int [][] array) {
        int row=0;
        int col=array.length-1;
        
        while(col>=0&&row<array[col].length){
            if(target<array[col][row])
                col--;
            else if(target>array[col][row])
                row++;
            else 
                return true;
        }
        
        return false;
        
    }
}

题目二:

题目描述

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

public class Solution {
    public String replaceSpace(StringBuffer str) {
        
        StringBuffer stb_new = new StringBuffer();
        
    	for(int i=0;i<str.length();i++){
            char c = str.charAt(i);
            if(c==' ')
                stb_new.append("%20");
            else
                stb_new.append(c);
        }
        
        return stb_new.toString();
    }
}
题目三:

题目描述

输入一个链表,从尾到头打印链表每个节点的值。

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
public class Solution {
    
    ArrayList<Integer> list = new ArrayList<Integer>();
    
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        
        if(listNode!=null)
        {
            printListFromTailToHead(listNode.next);
            list.add(listNode.val);
        }
        
        return list;
        
    }
}

题目四:

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

import java.util.*;
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        
        if(pre==null||in==null||pre.length==0||in.length==0)
            return null;
        
        TreeNode node = new TreeNode(pre[0]);
        
        //pre[0]是根节点  注意!1.通过遍历可以知道 中序的in数组里 i所处的位置,左边是左子树 右边是右子树
        //2.通过此时的i可以得出左右子树个数,就可以得出pre前序遍历中哪些是左子树的前序遍历
        for(int i=0;i<in.length;i++){
            if(pre[0]==in[i]){
                node.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),
                                                Arrays.copyOfRange(in,0,i));
                
                node.right=reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),
                                                 Arrays.copyOfRange(in,i+1,in.length));
            }
        }
        
        return node;
        
    }
}



posted @ 2018-01-17 17:50  词汇族  阅读(104)  评论(0)    收藏  举报