剑指offer算法题JZ1-JZ5

剑指offer算法题JZ1-JZ5

题库链接(牛客网)

JZ1 二维数组中的查找
描述
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
0 <= array.length <= 500
0 <= array[0].length <= 500
示例1

输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:true
说明:存在7,返回true 

示例2

输入:3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:false
说明:不存在3,返回false 

测试代码(java)

public class JZ1 {
    public static void main(String[] args) {
        int[][] a = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
        System.out.println(Find(7,a));
        int[][] b = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
        System.out.println(Find(3,b));
    }
    public static boolean Find(int target, int [][] array) {
        if (array.length == 0){
            return false;
        }
        for (int i = 0;i<array.length;i++) {
            if (array[i].length == 0){
                return false;
            }
            if (array[i][0] > target) {
                return false;
            }
            for (int j=0;j<array[i].length;j++) {
                if (array[i][j] == target) {
                    return true;
                } else if (array[i][j] > target) {
                    break;
                }
            }
        }
        return false;
    }
}

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

输入:"We Are Happy"
返回值:"We%20Are%20Happy"

测试代码(python)

class Solution:
    def replaceSpace(self , s ):
        # write code here
        return s.replace(' ','%20')

JZ3 从尾到头打印链表
描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:
返回一个数组为[3,2,1]
0 <= 链表长度 <= 1000
示例1

输入:{1,2,3}
返回值:[3,2,1]

示例2

输入:{67,0,24,58}
返回值:[58,24,0,67]

测试代码(java)

import java.util.*;

public class JZ3 {
    public static void main(String[] args) {
        ListNode l1 = new ListNode(1);
        ListNode l2 = new ListNode(2);
        ListNode l3 = new ListNode(3);
        l1.next = l2;
        l2.next = l3;
        System.out.println(printListFromTailToHead(l1));
    }
    public static ArrayList<Integer> list = new ArrayList<>();
    public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if (listNode != null){
            // 插入添加,后面的内容索引+1
            list.add(0, listNode.val);
            printListFromTailToHead(listNode.next);
        }
        return list;
    }
}
class ListNode {
    int val;
    ListNode next;

    ListNode(int val){
        this.val=val;
    }
}

JZ4 重建二叉树
描述
给定某二叉树的前序遍历和中序遍历,请重建出该二叉树并返回它的头结点。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。
提示:
1.0 <= pre.length <= 2000
2.vin.length == pre.length
3.-10000 <= pre[i], vin[i] <= 10000
4.pre 和 vin 均无重复元素
5.vin出现的元素均出现在 pre里
6.只需要返回根结点,系统会自动输出整颗树做答案对比
示例1

输入:[1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]
返回值:{1,2,3,4,#,5,6,#,7,#,#,8}
说明:返回根节点,系统会输出整颗二叉树对比结果    

示例2

输入:[1],[1]
返回值:{1}

示例3

输入:[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]
返回值:{1,2,5,3,4,6,7}

测试代码(java)

import java.util.Arrays;

public class JZ4 {
    public static void main(String[] args) {
        int[] pre = {1,2,4,7,3,5,6,8};
        int[] in = {4,7,2,1,5,3,8,6};
        TreeNode node = reConstructBinaryTree(pre, in);
        assert node != null;
        System.out.println("前序遍历");
        node.preOut();
        System.out.println("\n中序遍历");
        node.inOut();
    }
    public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        if (pre.length == 0 || in.length == 0){
            return null;
        }
        TreeNode node = new TreeNode(pre[0]);
        for (int i = 0; i < in.length; i++) {
            if (in[i] == pre[0]){
                node.left = reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0, i));
                node.right = reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length));
            }
        }
        return node;
    }
}
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
    // 前序遍历
    public void preOut(){
        System.out.print(this.val + " ");
        if (this.left != null) {
            this.left.preOut();
        }
        if (this.right != null) {
            this.right.preOut();
        }
    }
    // 中序遍历
    public void inOut(){
        if (this.left != null) {
            this.left.inOut();
        }
        System.out.print(this.val + " ");
        if (this.right != null) {
            this.right.inOut();
        }
    }
}

JZ5 用两个栈实现队列
描述
用两个栈来实现一个队列,分别完成在队列尾部插入整数(push)和在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。

示例:
输入:[“PSH1”,“PSH2”,“POP”,“POP”]
返回:
1,2
解析:
“PSH1”:代表将1插入队列尾部
“PSH2”:代表将2插入队列尾部
"POP“:代表删除一个元素,先进先出=>返回1
"POP“:代表删除一个元素,先进先出=>返回2
示例1

输入:["PSH1","PSH2","POP","POP"]
返回值:1,2

测试代码(java)

import java.util.Stack;

public class JZ5 {
    public static void main(String[] args) {
        push(1);
        push(2);
        push(3);
        System.out.println(pop());
        System.out.println(pop());
        push(4);
        System.out.println(pop());
        push(5);
        System.out.println(pop());
        System.out.println(pop());
    }

    static Stack<Integer> stack1 = new Stack<Integer>();
    static Stack<Integer> stack2 = new Stack<Integer>();

    public static void push(int node) {
        while (!stack2.isEmpty()){
            stack1.push(stack2.pop());
        }
        stack1.push(node);
    }

    public static int pop() {
        while (!stack1.isEmpty()){
            stack2.push(stack1.pop());
        }
        return stack2.pop();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值