持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
1 <= s.length <= 105s只包含字符"I"或"D"
二、思路分析:
我们阅读题意,可知给出的字符串s中只包含"I" 和 "D" ,要求对字符串s(长度为 n)规律返回一个整数prem (长度为n+1)的列表。
其中字符"I" 和 "D"代表的规律为:
-
"I": prem[i] < prem[i+1],prem[i+1]元素是相对递增的 -
"D":prem[i] > prem[i+1],prem[i+1]元素是相对递减的 -
查看题目给出的示例1,我们画图分析如下所示,
- s字符串:“IDID”
- prem列表可以为:[0,4,1,3,2],[0,4,2,3,1]...只要符合"增减增减"的规律都可以
题目要求,prem列表的元素不能重复,因此在对字符串s遍历时,每取完一个索引,则索引集合减去一个索引元素。对字符串"IDID"进行推导,如下:
- 字符串s="IDID",n+1 索引坐标则为[0,1,2,3,4]五个数值
- 当s[0]="I"时,则在|0,1,2,3,,4|取出最小数如 0,prem=[0]
- 当s[1]="D"时,则在|1,2,3,4|取出最大数如4,prem=[0,4]
- 当s[2]="I"时,则在|1,2,3|取出最小数1,prem=[0,4,1]
- 当s[3]="D"时,则在|2,3|取出最大数3,prem=[0,4,1,3]
- 最后还剩下|2|,prem列表添加到,prem=[0,4,1,3,2]
根据以上,思路我们可以快速实现出如下代码:
class Solution(object):
def diStringMatch(self, s):
"""
:type s: str
:rtype: List[int]
"""
n = len(s)+1
tmp = list(range(n))
ans = []
for i in range(len(s)):
if s[i] == "I" :
ans.append(min(tmp))
tmp.remove(min(tmp))
if s[i] == "D" :
ans.append(max(tmp))
tmp.remove(max(tmp))
ans = ans + tmp
return ans
但是,我们提交代码一看,AC记录要4000多秒,时间太长了。
如何保证,提高我们程序的计算效率呢?
方法:双指针
- 定义两个变量,left和right
- Left 指向字符串s的开始位置
- right指向字符串s的len(s)位置
- 通过for循环遍历字符串s,当s[i]=="I"时,则res.append(left),left +=1
- 当s[i]=="D"时,则res.append(right),right -=right
- 自到遍历完整个字符串s后,res.append(left)
根据以上思路,我们使用python能快速的实现出来:
class Solution(object):
def diStringMatch(self, s):
"""
:type s: str
:rtype: List[int]
"""
ans = []
left,right = 0,len(s)
for i in range(len(s)):
if s[i] == "I" :
ans.append(left)
left = left +1
else:
ans.append(right)
right = right -1
ans.append(left)
return ans
三、总结:
本期,我们继续使用双指针思想解答题目。该题主要考察的是找出增减规律,结合双指针就可以AC该题了。
- 时间复杂度O(N),N为字符串s的长度
- 空间复杂度O(1),返回值不计入
以上是本期内容,欢迎大佬们点赞评论,下期见