剑指offer——简单题(一)

前言

因为这几题太简单了,总结一下思路就行了。

题目

构建乘积数组

思路

知识点:数组

其实就是for循环加个判断条件。牛客上有人调用了一些大数之类的API,感觉没啥必要。。为了AC可以,面试的时候这样是真的秀逗了。

描述

给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)


代码

public int[] multiply(int[] A) {
        int[] B = new int[A.length];
        for (int i = 0; i < A.length; i++) {
            B[i] = 1;
            for (int j = 0; j < A.length; j++) {
                if (j != i){
                    B[i] = B[i] * A[j];
                }
            }
        }
        return B;
    }

变态跳台阶

思路

知识点:贪心
我的思路是类似于动态规划的一种思想。初始化sum[i]=1是一次直接跳完;然后第一次跳1台阶,有sum[n-1]种方法;第一次如果跳2的话,有sum[n-2]种方法…以此类推。

但说实话,另一种思路数学规律推导代码更好。

描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

代码

public int JumpFloorII(int target) {
        int[] sum = new int[10010];
        sum[0] = 1;
        sum[1] = 2;
        for (int i = 2; i < target; i++) {
            sum[i] = 1; 
            for (int j = 0; j < i; j++) {
                sum[i] += sum[j];

            }
        }
        return sum[target-1];
    }

另一种思路:

因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级
跳1级,剩下n-1级,则剩下跳法是f(n-1)
跳2级,剩下n-2级,则剩下跳法是f(n-2)
所以f(n)=f(n-1)+f(n-2)+…+f(1)
因为f(n-1)=f(n-2)+f(n-3)+…+f(1)
所以f(n)=2*f(n-1)

二叉树的镜像

思路

知识点:树
递归写一下交换左右子树即可,注意终止条件

题目

操作给定的二叉树,将其变换为源二叉树的镜像。

代码

public void Mirror(TreeNode root) {
        if (root != null) {
            TreeNode temp = root.left;
            root.left = root.right;
            root.right = temp;
            if (root.left != null) {
                Mirror(root.left);
            }

            if (root.right != null) {
                Mirror(root.right);
            }
        }
    }

用两个栈实现队列

思路

知识点:队列 栈
stack1专门用来入栈,stack2专门用来出栈。

描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

代码

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

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

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

你可能感兴趣的:(算法)