剑指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 · 178 阅读 · 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 · 182 阅读 · 0 评论 -
面试题16.数值的整数次方
题目实现函数 double Power(double base,intexponent),求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 · 126 阅读 · 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 · 281 阅读 · 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 · 182 阅读 · 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 · 221 阅读 · 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 · 308 阅读 · 0 评论 -
面试题11.旋转数组的最小数字
题目把一个数组最开始的若干元素搬到数组的末尾,称之为数组的旋转。 输入一个排序好了的递增数组的旋转,要求输出旋转数组的最小元素。如输入:[5,7,1,2,3]输出:1注意是否包含重复元素算法思路为了追求算法高效,减低复杂度,如果单单是找出最小元素,直接遍历一遍就可有得出,时间复杂度为O(N ),而很显然本题需要的不是该方法,有比挨个遍历数组更高效的方法,下面来分析题目,数组将原本已经升序排序好的数组通过分割,分割成为两部分,而左边那部分变为右边部分,如下图:通过上图分析,可以使用二分法原创 2020-06-06 17:28:35 · 174 阅读 · 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 · 499 阅读 · 0 评论 -
面试题09. 用两个栈实现队列
题目用两个栈实现一个队列。队列的声明如下,实现他的两个函数appendTail 和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回-1)示例 输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”] [[],[3],[],[]]输出:[null,null,3,-1]算法思路栈的特性是先进后出,队列是先进先出,题目要求通过两个栈来实现队列,说明必有一个是辅助栈(可以看做队列原创 2020-06-06 10:59:35 · 159 阅读 · 0 评论 -
面试题29. 顺时针打印矩阵
题目输入一个矩阵,要求按照从外向里顺时针依次打印出每一个数字。示例:输入:matrix =[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]限制:0 <= matrix.length <= 1000 <= matrix[i].length <= 100本题与LeetCode 54题相同:https://leetcode-cn.com/problems/spiral-matrix/算法思路按照题目要求,打印顺序依次为原创 2020-06-05 17:32:12 · 147 阅读 · 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 · 124 阅读 · 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 · 191 阅读 · 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 · 187 阅读 · 0 评论