剑指Offer每日六题(JAVA版)之第一天

二维数组中的查找

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

解题思路:

直接遍历二维数组查找

public class Solution {
    public boolean Find(int target, int [][] array) {
    	for(int i=0;i<array.length;i++) {
    		for(int j=0;j<array[i].length;j++) {
    			if(array[i][j]==target) {
    				return true;
    			}
    		}
    	}
        return false;
    }
}

  

替换空格

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

解题思路:

遍历字符串,查找空格所在位置,使用replace替换空格为'%20'即可

public class Solution {
    public String replaceSpace(StringBuffer str) {
    	for (int i=0;i<str.length();i++) {
    		if(str.charAt(i)==' ') {
    			str.replace(i, i+1, "%20");
    		}
    	}
    	return String.valueOf(str);
    }
}

  

从尾到头打印链表

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

题目思路:

使用栈来实现,首先将链表中所有元素入栈,然后在将栈中元素出栈放在ArrayList中即可

import java.util.ArrayList;
import java.util.Stack;
class ListNode {
        int val;
        ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
    }

public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    	ArrayList<Integer>array = new ArrayList<>();
        Stack<Integer>sta1 = new Stack<>();
        while(listNode!=null) {
        	sta1.push(listNode.val);
            listNode = listNode.next;
        }
        while(!sta1.empty()) {
        	array.add(sta1.pop());
        }
        return array;
    }
}

  

重建二叉树

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

解题思路:

首先可以通过前序遍历找到二叉树的根节点,然后再在中序遍历中找到该点,左侧为左子树,右侧为右子树,递归建树即可

普及知识:

先序遍历:根节点->左子树->右子树

中序遍历:左子树->根节点->右子树

后续遍历:左子树->右子树->根节点

所谓的树的遍历前,中,后所指的是根节点的位置.

/**
 * 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) {
    	  return reconBTree(pre, 0, pre.length-1, in, 0, in.length-1);
    }
    
    public TreeNode reconBTree(int []pre,int preleft,int preright,int []in,int inleft,int inright) {
    	if(preleft>preright||inleft>inright)
            return null;
    	else {
    		TreeNode root = new TreeNode(pre[preleft]);
        	for(int i=inleft;i<=inright;i++) {
        		if(pre[preleft]==in[i]) {
        			root.left = reconBTree(pre, preleft+1, preleft+i-inleft, in, inleft, i-1);
        			root.right = reconBTree(pre, preleft+i+1-inleft, preright, in, i+1, inright);
        		}
    		}
        	return root;
    	}
    }
}

  

用两个栈实现队列

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

解题思路:

首先在push过程中将元素入栈,当pop时再将A栈中的元素pop出存到B栈中,最后在pop之后再将B栈中的元素存回到A栈中,即可实现队列

import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        stack1.push(node);
    }
    
    public int pop() {
    	while(!stack1.isEmpty()) {
    		stack2.push(stack1.pop());
    	}
    	Integer temp = stack2.pop();
    	while(!stack2.isEmpty()) {
    		stack1.push(stack2.pop());
    	}
    	return temp;
    }
}

旋转数组的最小元素

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

解题思路

这个题目可以使用最基础的,直接暴力查找,但是时间复杂度很高,不推荐使用,下面使用二分查找

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
    	if(array.length==0) {
    		return 0;
    	}
    	int left = 0;
    	int right = array.length-1;
    	int middle = -1;
    	while(array[left]>=array[right]) {
    		if(right-left==1) {
    			middle = right;
    			break;
    		}
    		middle =left+ (right-left)/2;
    		if(array[middle]>=array[left]) {
    			left = middle;
    		}
    		if(array[middle]<=array[right]) {
    			right = middle;
    		}
    	}
    	return array[right];
    }
}

  

 

posted @ 2018-12-05 18:06  Bug研发工程师  阅读(150)  评论(0编辑  收藏  举报