剑指offer题解1-5(Java)

剑指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();
            
    }
}
发布了36 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42297075/article/details/104338567