剑指offer
小青蛙lz
Stay Hungry. Stay Foolish.http://www.bewindoweb.com/dwg.php
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
面试题21. 调整数组顺序使奇数位于偶数前面
题目 输入一个数组,实现一个函数来调整数组中数字的位置,使得所有奇数位于数组的前半部分,偶数位于数组的后半部分。 示例 输入:nums = [1,2,3,4] 输出:[1,3,2,4] 注:[3,1,2,4]也是答案。 提示:1 <= nums.length <= 50000 1 <= nums[i] <= 10000 解题思路 三种方法,暴力解法,首尾双指针,快慢指针法。 第一种暴力解法,通过引入一个新的数组用于记录,从头开始遍历整个数组,奇数从新数组的开始为存入,偶数从最后一原创 2020-06-12 15:20:46 · 226 阅读 · 0 评论 -
面试题18. 删除链表的节点
题目 给定单向链表的头指针和一个要删除的节点,定义一个函数删除该节点。 示例 输入:head = [4,5,1,9] ,val = 5 输出:[4,1,9] 题目中链表节点值互不相同 解题思路 两种方法,原理都差不多,定为节点,删除引用。即都是通过找val的节点,然后将val前一个节点的next指向val这个节点的next。 方法一:单指针,算法流程: 特例处理:当应该删除头结点时,直接返回head.next即可; 初始化:定义一个 list = head ; 定位节点:当list.next为空 或原创 2020-06-12 10:45:05 · 235 阅读 · 0 评论 -
面试题16.数值的整数次方
题目 实现函数 double Power(double base,int exponent),求base的exponent次方。不使用库函数,同时不需要考虑大数问题,exponent是32位有符号整数。 示例一 输入:2.0,10 输出:1024.00000 示例二 输入:2.0 ,-2 输出:0.250000 算法思路 分析此题,几个关键条件,一是base的类型是double,二是不得使用库函数,次方n为无符号整数,n可能为负数。 方法一 递归 很明显,本题可以通过不断往下递归,每次递归将n除以2,原创 2020-06-11 15:17:42 · 171 阅读 · 0 评论 -
面试题15. 二进制中1的个数
题目 实现一个函数,输入一个整数,输出该数二进制中1的个数。 示例1: 输入:0000000000000000000010 输出:1 示例2: 输入:11111111111111111111111111111101 输出:31 算法思路 方法一:通过移位运算,每次将数n右移一位,判断该数最后一位是否是1,通过 n&1即可判断最后一位是否为1,通过 n>>1即可将数字右移一位,本题是无符号右移,在Java中,无符号右移是 >>> 即n>>>1. 复原创 2020-06-11 11:41:17 · 340 阅读 · 0 评论 -
面试题14.剪绳子I II
题目 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1 算法思路 动态规划 状态定义:定义一个一维数组dp,dp[i]的值表示长度为i的绳子的最大乘积;原创 2020-06-10 17:25:09 · 230 阅读 · 0 评论 -
面试题12. 矩阵中的路径(DFS)
题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。 例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。 [["a","b","c","e"], ["s","f","c","s"], ["a","d","e","e"]] 但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据.原创 2020-06-09 16:33:36 · 269 阅读 · 0 评论 -
面试题46. 把数字翻译成字符串(递归 + 动态规划)
题目 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 示例 1: 输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi” 方法一 递归 这道题我最先想到的方法是递归,从第一个数开始,每次取当前数字或先后取一个组成两位数,如果能够成原创 2020-06-09 14:12:37 · 376 阅读 · 0 评论 -
面试题11.旋转数组的最小数字
题目 把一个数组最开始的若干元素搬到数组的末尾,称之为数组的旋转。 输入一个排序好了的递增数组的旋转,要求输出旋转数组的最小元素。 如输入:[5,7,1,2,3] 输出:1 注意是否包含重复元素 算法思路 为了追求算法高效,减低复杂度,如果单单是找出最小元素,直接遍历一遍就可有得出,时间复杂度为O(N ),而很显然本题需要的不是该方法,有比挨个遍历数组更高效的方法,下面来分析题目,数组将原本已经升序排序好的数组通过分割,分割成为两部分,而左边那部分变为右边部分,如下图: 通过上图分析,可以使用二分法原创 2020-06-06 17:28:35 · 215 阅读 · 0 评论 -
面试题10.斐波那契数列
题目 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 算法思路 题目简单,动态规划很快的解决。 定义状态:定义数组dp,用于存放斐波那契数列的前n项原创 2020-06-06 13:51:59 · 573 阅读 · 0 评论 -
面试题09. 用两个栈实现队列
题目 用两个栈实现一个队列。队列的声明如下,实现他的两个函数appendTail 和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回-1) 示例 输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”] [[],[3],[],[]] 输出:[null,null,3,-1] 算法思路 栈的特性是先进后出,队列是先进先出,题目要求通过两个栈来实现队列,说明必有一个是辅助栈(可以看做队列原创 2020-06-06 10:59:35 · 203 阅读 · 0 评论 -
面试题29. 顺时针打印矩阵
题目 输入一个矩阵,要求按照从外向里顺时针依次打印出每一个数字。 示例: 输入: matrix =[[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 限制: 0 <= matrix.length <= 100 0 <= matrix[i].length <= 100 本题与LeetCode 54题相同:https://leetcode-cn.com/problems/spiral-matrix/ 算法思路 按照题目要求,打印顺序依次为原创 2020-06-05 17:32:12 · 189 阅读 · 0 评论 -
面试题07. 重建二叉树
题目 给出某二叉树的前序遍历和中序遍历的结果数组,重建二叉树。假设输入的前序遍历和中序遍历中没有重复的数字。 例如:给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树:[3,9,20,null,null,15,7] 与LeetCode 105 题重复:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-tr原创 2020-06-05 16:09:56 · 166 阅读 · 0 评论 -
面试题04.二维数组中的查找
题目 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ] 给定 target = 5,返原创 2020-06-04 15:01:26 · 240 阅读 · 0 评论 -
面试题03.数组中重复的数字
题目 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 限制:2 <= n <= 100000 算法思路 本题思路大致分为三种。 方法一:使用哈希表来记录,依次遍历,如果哈希表中没有该数字,就加入哈希集中,存在就说明该数字重复了,返回即可。该方法时间原创 2020-06-04 14:35:55 · 226 阅读 · 0 评论
分享