剑指offer1-4题

第一题 二维数组查找

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

解题思路:

1.利用二维数组行列的特点,从右上角或者左下角开始寻找,每次寻找都可以减少一行或一列。(最优方案

如下图所示:

 2.二分查找,以行为单位,每次对一行进行遍历,二分查找的比较则是行首元素。(原始思路)


第二题 替换空格

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

无难点,主要为字符串子串的拼接问题


第三题 从尾到头打印链表

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

解题思路:

1.看到倒序,应该想到栈,不显式声明栈,可以利用递归。(最优思路)

public class Solution {
    ArrayList<Integer> arrayList=new ArrayList<Integer>();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if(listNode!=null){
            this.printListFromTailToHead(listNode.next);
            arrayList.add(listNode.val);
        }
        return arrayList;
    }
} 

2.先将元素放入列表当中,然后倒序,倒序可以采用互换的方式,这样可以节省空间。(原始思路)

int tmp = list.get(i);

list.set(i, list.get(list.size() - i - 1));

list.set(list.size() - i - 1, tmp);

第四题 重建二叉树

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

相关知识介绍:

前序遍历是根左右,中序遍历是左根右。

解题思路:

1.前序遍历的首位肯定是根节点,然后在中序遍历中找寻这个根节点,那么前半部分是左子树,右半部分是右子树,

采用递归,则可构建完整二叉树。(一般思路)

注意事项:

1.递归出口要设计

2.可以使用Arrays.copyOfRange截取子数组,但是注意是从数组下标from到to-1。

猜你喜欢

转载自blog.csdn.net/lth6483/article/details/83622732