今天刷的这道算法题名字叫“超市里的货物架调整”,我将和大家分享一下我的解题过程和途中遇到问题,以下是原题:
问题描述
在一个超市里,有一个包含 n 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 n 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:
n:货物架的格子数m:顾客想要购买的商品种类数s:货物架上商品的初始顺序c:顾客想要购买的商品种类
测试样例
样例1:
输入:
n = 3 ,m = 4 ,s = "abc" ,c = "abcd"
输出:3
样例2:
输入:
n = 4 ,m = 2 ,s = "abbc" ,c = "bb"
输出:2
样例3:
输入:
n = 5 ,m = 4 ,s = "bcdea" ,c = "abcd"
输出:4
解题过程
对于这道问题我一开始的思路是:用整数n表示字符串s的字符数,用整数m表示字符串c的字符数,然后逐个比对字符串s和字符串c中的相同元素,对比的过程中定义一个整型变量x,每有一个相同元素变量x就进行一次自增运算,最后函数返回x。
以下是我第一次写的代码:
def solution(n: int, m: int, s: str, c: str) -> int:
i = 0
j = 0
x = 0
while (i < n):
while (j < m):
if s[i] == c[j]:
x = x+1
break
j = j+1
i = i+1
j = 0
return x
我先是定义了两个整型变量i和j分别代表字符串s和c的字符位,再利用循环嵌套从字符串s的第一位字符开始与字符串c的每一位字符进行比较,内循环直到字符串s的其中一位字符与字符串c中的某一字符比较相同时才会停止循环,而外循环则是将字符串s的每一位都逐一与字符串c进行比较,比较到字符串s的最后一位才结束循环。运行后第三个测试都True了,但是一点提交更多的测试就False了。简单浏览了一下代码很快就发现了问题:没有考虑被买走的商品留下的空格子不能再买。
然后我想到的办法就是在比对成功后直接删除字符串c中的比对成功的那一位字符,这样就和多了一个空格子差不多, 在判断语句下加了两行代码:其中c = c[0:j]+c[j+1:]可以将删掉的那一位之前的字符和之后的字符拼接到一起形成的字符串赋给字符串c,从而达成删掉那一位的效果,而m = m-1就比较好理解了,用于同步字符串c的字符数,防止无意义循环导致bug。
以下是最终代码:
def solution(n: int, m: int, s: str, c: str) -> int:
i = 0
j = 0
x = 0
while (i < n):
while (j < m):
if s[i] == c[j]:
x = x+1
c = c[0:j]+c[j+1:]
m = m-1
break
j = j+1
i = i+1
j = 0
return x
运行一下,成功通过所有测试。
由于我是python初学者,刚接触没多久,基础语法还没了解,所以此算法应该还可以改进,性能还能提升,欢迎大家给我提出修改建议。