剑指offer题解1-5
1.二维数组查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
代码:
public class Solution {
public boolean Find(int target, int [][] array) {
//从最右上角的元素开始搜索,小于target就向下,大于就向左
int col=array[0].length-1;
int row=0;
while(row<=array.length-1&&col>=0){
if(array[row][col]>target){
col--;
}
else if(array[row][col]<target){
row++;}
else{
return true;
}
}
return false;
}
}
2.替换空格
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
代码:
public class Solution {
public String replaceSpace(StringBuffer str) {
String s=str.toString();
char[] a=s.toCharArray();
String res="";
//转换成字符数组,是空格就替换,不是就保持
for(char c:a){
if(c==' '){
res+="%20";
}
else{
res+=c;
}
}
return res;
}
}
3.链表反转
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
代码
import java.util.Collections;
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> res=new ArrayList<Integer>();
while(listNode!=null){
//add方法可以限制在制定位置添加元素
res.add(0,listNode.val);
listNode=listNode.next;
}
return res;
}
}
4.重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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; }
* }
*/
import java.util.Arrays;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
//pre长度为0,则没有子树,返回null
if(pre.length==0){
return null;
}
//根节点值
int val =pre[0];
//一个子节点
if(pre.length==1){
return new TreeNode(val);
}
TreeNode root=new TreeNode(val);
int rootIndex=0;
for(int i=0;i<in.length;i++){
if(in[i]==val){
rootIndex=i;
break;
}
}
root.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,rootIndex+1),Arrays.copyOfRange(in,0,rootIndex));
root.right=reConstructBinaryTree(Arrays.copyOfRange(pre,rootIndex+1,pre.length),Arrays.copyOfRange(in,rootIndex+1,in.length));
return root;
}
}
5.两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
代码
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
//直接push
stack1.push(node);
}
public int pop() {
//当2为空,则把1的元素倒进去
if(stack2.isEmpty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
//不为空,直接把顶元素推出
return stack2.pop();
}
}