请实现一个函数,把字符串中的每个空格替换成”%20”。
你可以假定输入字符串的长度最大是1000。
注意输出字符串的长度可能大于1000。
样例
输入:”We are happy.”
输出:”We%20are%20happy.”
考察点: 从后往前遍历,逆向思维。
与之类似的题目: memcpy实现。
1 | class Solution { |
请实现一个函数,把字符串中的每个空格替换成”%20”。
你可以假定输入字符串的长度最大是1000。
注意输出字符串的长度可能大于1000。
样例
输入:”We are happy.”
输出:”We%20are%20happy.”
考察点: 从后往前遍历,逆向思维。
与之类似的题目: memcpy实现。
1 | class Solution { |
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。
2~10为数字本身,A为1,J为11,Q为12,K为13,大小王可以看做任意数字。
为了方便,大小王均以0来表示,并且假设这副牌中大小王均有两张。
样例1
输入:[8,9,10,11,12]
输出:true
样例2
输入:[0,8,9,11,12]
输出:true
1 | class Solution { |
字符串匹配算法
暴力匹配算法
P进制Hash算法 O(N)时间复杂度
BM算法核心思想是,利用模式串本身的特点,在模式串中某个字符与主串不能匹配的时候,将模式串往后多滑动几位,
以此来减少不必要的字符比较,提高匹配的效率。BM算法构建的规则有两类,坏字符规则和好后缀规则。
好后缀规则可以独立于坏字符规则使用。因为坏字符规则的实现比较耗内存,为了节省内存,我们可以只用好后缀规则来实现BM算法
KMP算法借鉴BM算法的思想,可以总结成好前缀规则
可以对Trie进行内存优化,有序数组、平衡数、跳表等
给定一个数组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]。
不能使用除法。
时间复杂度:$O(n^2)$
空间复杂度:除结果数组外,$O(1)$
1 | class Solution { |
前缀和思想:当需要多次计算从i到j的累加和时,我们可以考虑计算序列的前缀和序列,把i到j的累加和转换为前缀和序列中i,j下标的元素之差。
重复计算必可优化原则:当一套解法中存在重复计算时,我们总是可以依照空间换时间原则,将可能存在重复的计算结果存下来。存下来之后,算法的执行效率便提升了。
注意到,前面的暴力解法中,对于i与i+1两个下标的计算,总是会重复计算A[1]到A[i],我们是否可以仅计算一次呢?
时间复杂度:$O(n)$
空间复杂度:除结果数组外,$O(n)$
1 | class Solution { |
考虑上面代码中的第3步,res[i]的计算仅与pre_part数组中的i - 1项有关,我们是否可以把pre_part的计算结果存放在res中呢?
如果把第3步的迭代顺序反一下,那么第2部分与第3部分的迭代顺序就一致了。并且post_part[i]仅与前一项有关,我们可以做空间压缩(动态规划背包问题的常见套路),仅使用一个变量即可。
时间复杂度:$O(n)$
空间复杂度:除结果数组外,$O(1)$
1 | class Solution { |
将一个骰子投掷n次,获得的总点数为s,s的可能范围为n~6n。
掷出某一点数,可能有多种掷法,例如投掷2次,掷出3点,共有[1,2],[2,1]两种掷法。
请求出投掷n次,掷出n~6n点分别有多少种掷法。
样例1
输入:n=1
输出:[1, 1, 1, 1, 1, 1]
解释:投掷1次,可能出现的点数为1-6,共计6种。每种点数都只有1种掷法。所以输出[1, 1, 1, 1, 1, 1]。
样例2
输入:n=2
输出:[1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1]
解释:投掷2次,可能出现的点数为2-12,共计11种。每种点数可能掷法数目分别为1,2,3,4,5,6,5,4,3,2,1。
所以输出[1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1]。
表示i次骰子透出j的投法数量。
1 | class Solution { |
请实现一个函数用来匹配包括’.’和’*’的正则表达式。
模式中的字符’.’表示任意一个字符,而’*’表示它前面的字符可以出现任意次(含0次)。
在本题中,匹配是指字符串的所有字符匹配整个模式。
例如,字符串”aaa”与模式”a.a”和”abaca”匹配,但是与”aa.a”和”ab*a”均不匹配。
样例
输入:
s=”aa”
p=”a*”
输出:true
动态规则
f(i,j)表示字符串a从i到结尾是否匹配字符串b从j到结尾
f(m,n) => f(0,0)
给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。
例如,如果输入数组[2, 3, 4, 2, 6, 2, 5, 1]及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为[4, 4, 6, 6, 6, 5]。
注意:
数据保证k大于0,且k小于等于数组长度。
样例
输入:[2, 3, 4, 2, 6, 2, 5, 1] , k=3
输出: [4, 4, 6, 6, 6, 5]
1 | class Solution { |