剑指offer
剑指 Offer 03. 数组中重复的数字 - 力扣(LeetCode)
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
1 | class Solution { |
剑指 Offer 04. 二维数组中的查找 - 力扣(LeetCode)
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
和之前的leetcode hot100题一样,从右向左,从上向下遍历
1 | class Solution { |
剑指 Offer 05. 替换空格 - 力扣(LeetCode)
请实现一个函数,把字符串 s
中的每个空格替换成”%20”。
1 | class Solution { |
剑指 Offer 06. 从尾到头打印链表 - 力扣(LeetCode)
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
由于栈有先进后出的特性,考虑用栈实现
1 | /** |
剑指 Offer 09. 用两个栈实现队列 - 力扣(LeetCode)
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
1 | class CQueue { |
剑指 Offer 10- I. 斐波那契数列 - 力扣(LeetCode)
写一个函数,输入 n
,求斐波那契(Fibonacci)数列的第 n
项(即 F(N)
)。斐波那契数列的定义如下:
使用动态规划的思想,比递归效率更高,不需要重复计算。
1 | class Solution { |
剑指 Offer 10- II. 青蛙跳台阶问题 - 力扣(LeetCode)
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
实际上与前面的斐波那契数列一样
1 | //dp数组表示登上第i个台阶有多少种走法 |
剑指 Offer 11. 旋转数组的最小数字 - 力扣(LeetCode)
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。
注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。
考虑[1, 3, 3, 3, 3, 4, 5]的情况,变形后变成[3, 3, 3, 3, 4, 5, 1]或者[4, 5, 1, 3, 3, 3, 3]
1 | class Solution { |
剑指 Offer 12. 矩阵中的路径 - 力扣(LeetCode)
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。
深度优先的思想
1 | class Solution { |
剑指 Offer 14- I. 剪绳子 - 力扣(LeetCode)
给你一根长度为 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。
动态规划的思想:dp[i]表示长度为i的绳子的最大乘积
1 | //dp[i]表示长度为i的绳子的最大乘积 |
剑指 Offer 14- II. 剪绳子 II - 力扣(LeetCode)
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
dp方法不行了,只能用数值解法,实际上将所有的数都尽可能拆成3乘积最大。
1 | //dp[i]表示长度为i的绳子的最大乘积 |
剑指 Offer 15. 二进制中1的个数 - 力扣(LeetCode)
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。
n & 1 == 1即n最右边一位为1.
1 | class Solution { |
剑指 Offer 16. 数值的整数次方 - 力扣(LeetCode)
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
1 | class Solution { |
剑指 Offer 17. 打印从1到最大的n位数 - 力扣(LeetCode)
输入数字 n
,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
1 | class Solution { |
另一种方法:回溯
1 | class Solution { |
剑指 Offer 18. 删除链表的节点 - 力扣(LeetCode)
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
1 | /** |
剑指 Offer 19. 正则表达式匹配 - 力扣(LeetCode)
请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”abaca”匹配,但与”aa.a”和”ab*a”均不匹配。
1 | class Solution { |
剑指 Offer 20. 表示数值的字符串 - 力扣(LeetCode)
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
有限状态机的思想,小数点前后有没有数字都行,e前后必须有数字。
1 | class Solution { |
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 - 力扣(LeetCode)
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
双指针的思想,从前向后遍历偶数和从后向前遍历的奇数互换。
1 | //双指针 |