题目4~7

来源:互联网 发布:网络网警客服在线电话 编辑:程序博客网 时间:2024/06/17 22:12

4.替换空格

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

public class Solution {    public String replaceSpace(StringBuffer str) {    //return str.toString().replaceAll(" ","%20");        char[] cs=str.toString().toCharArray();        int blank=0;        for(int i=0;i<cs.length;i++){            if(cs[i]==' ') blank++;        }        char[] res=new char[cs.length+blank*2];        int j=res.length-1;        for(int i=cs.length-1;i>=0;i--){            if(cs[i]==' '){                res[j--]='0';                res[j--]='2';                res[j--]='%';                continue;            }else{                res[j--]=cs[i];            }        }        return new String(res);    }}

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

题目大致为:

    输入一个链表的头结点,从未到头反过来打印每个结点的值。

思路:

    题目的要求是进行从尾到头输出,而链表的查找只能是顺序查找,栈的结构满足这样的条件:先进后出。同样,也可以使用递归的方式求解。

import java.util.ArrayList;public class Solution {    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {        ListNode head=listNode;        Stack<Integer> stack=new Stack();        while(head!=null){            stack.push(head.val);            head=head.next;        }        ArrayList<Integer> res=new ArrayList();        while(!stack.isEmpty()){            res.add(stack.pop());        }        return res;    }}

6.重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。

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


思路:

    如图所示,在前序遍历的序列中第一个就是树的根结点,此时再在中序遍历的序列里查找这个根结点,则中序遍历的序列里根结点左侧的就是左子树,右侧的就是右子树,再对左右子树进行同样的操作,此时可以使用递归实现,这样便能构造出这个二叉树


public class Solution {    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {        TreeNode root=new TreeNode(pre[0]);        int leftNum=0;//左子树节点个数        for(int i=0;i<in.length;i++){            if(in[i]==root.val) break;            leftNum++;        }        int rightNum=pre.length-leftNum-1;//右子树节点个数                 if(leftNum>0){            int[] leftPre=new int[leftNum];//左子树的前序遍历结果            int[] leftIn=new int[leftNum];//左子树的中序遍历结果            for(int i=0;i<leftNum;i++){                leftPre[i]=pre[i+1];//i+1的原因,是每次pre[0]对应为子树的根                leftIn[i]=in[i];                             }                         TreeNode leftNode=reConstructBinaryTree(leftPre,leftIn);            root.left=leftNode;//根节点的左孩子节点        }                 if(rightNum>0){            int[] rightPre=new int[rightNum];            int[] rightIn=new int[rightNum];            for(int i=0;i<rightNum;i++){                rightPre[i]=pre[leftNum+i+1];                rightIn[i]=in[leftNum+i+1];//+1的原因是,中间的有一个是根            }            TreeNode rightNode=reConstructBinaryTree(rightPre,rightIn);            root.right=rightNode;        }                 return root;    }      }


public class Solution {    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {        TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);        return root;    }    //前序遍历{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}    private TreeNode reConstructBinaryTree(int [] pre,int startPre,int endPre,int [] in,int startIn,int endIn) {                 if(startPre>endPre||startIn>endIn)            return null;        TreeNode root=new TreeNode(pre[startPre]);//每次都将根节点取出                 for(int i=startIn;i<=endIn;i++)            if(in[i]==pre[startPre]){//每次在中序中找到根                root.left=reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);                root.right=reConstructBinaryTree(pre,i-startIn+startPre+1,endPre,in,i+1,endIn);            }                         return root;    }}


原创粉丝点击