第一题 二维数组查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:
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。