写道困难题来写一篇题解来发布,但是呢这道题为困难题我觉得有点德不配位了。(也可能是我力扣刷过类似的题的缘故),好了废话不多说,请看题解。
这道题的题目是:给你一个只含01的字符串,和一个整数k,经过k次换位操作,求得到字典序最小的字符串。(换位操作只能是相邻位置的子字符)
1.首先先要明白什么是字典序:简单来说,类似于数字,从右往左看,最右边的为最小位,越往左越大,同位的就拿ascll码比较。这道题比较人性化,只有0和1,1的编码肯定是大于0的,所以我们变换的思路就得到的,尽量把0换到高位。
2.然后再考虑,什么时候最小,遍历方式肯定不是循环遍历整个字符串(别问我为什么知道的)按照上面说的字典序,靠左是高位,靠右是低位,改变靠右的子字符对整个字符串的字典序影响更大,所以说要尽量在左边进行操作
好了大致的思路就是这样,具体的请看代码
1.初始变量,将字符串s每一位分开,存入中
s = list(s)
do=0
遍历一次数组,找到‘0’所在,因为要尽量在左边操作,所以我的思路是从左边开始遍历,找到零,将它按照题目条件往高位换,换到它换无可换(换的条件是:s[i]=='1' and s[i-1]=='1')每次操作一次do加一,直到d=k,停止操作
for i in range(n):
if s[i] == '0':
# 找到当前 '0' 的位置,尝试将其移动到最前面
j = i
while j > 0 and s[j-1] == '1' and do < k:
s[j], s[j-1] = s[j-1], s[j]
j -= 1
do += 1
if do == k:
break
return ''.join(s)
这就是这题的所有思路,感觉就没有那么难,主要是要知道字典序的概念,然后经过一定的审题和分析就可以得到答案,并没有那么难,感觉不配困难题。下一篇得找道有含金量的题来写。 最后完整代码附上
def solution(n: int, k: int, s: str) -> str:
# write code here
do=0
new_s=list(s)
for i in range(n):
if new_s[i]=='0':
j=i
while j>0 and new_s[j-1]=='1' and do<k:
new_s[j],new_s[j-1]=new_s[j-1],new_s[j]
do+=1
j-=1
if do==k:break
return ''.join(new_s)
if __name__ == '__main__':
print(solution(5, 2, "01010") == '00101')
print(solution(7, 3, "1101001") == '0110101')
print(solution(4, 1, "1001") == '0101')