本博客含有两道题目:最少步数归零问题;字典序最小的01字符串
最少步数归零问题
问题描述
小R拿到了一个长度为n的数组,其中每个元素都是一个正整数。小R发现每次可以删除某个数组中某个数的一位数字,这样可以逐步将所有数字变为0。他想知道,要将数组中所有数字都变为0,最少需要多少步?
例如:对于数字 103,小R可以选择删除第1位数字,将其变为 3;或者删除第2位数字,变为 13,又或者删除第3位数字,将其变为 10。最终目标是将所有数字都删除为0。
我的思路
- 首先对数组中的数字进行遍历
- 然后统计每个数字的位数以及包含数字0的个数
- 最终返回的结果是数组中所有数字的位数减去数字0的个数。
MarsCode AI的思路
- 遍历数组中的每个数字。
- 对于每个数字,计算其长度(即位数)。
- 将所有数字的长度相加,得到最少需要的操作次数。
对比思路之后,发现AI的思路有些问题,并没有起到优化我的思路的过程。
编程并使用MarsCode AI进行优化
以下是针对我的思路进行了代码编写
def solution(n: int, a: list) -> int:
# 初始化一个变量来存储总操作次数
total_steps = 0
# 遍历数组中的每个数字
for num in a:
# 计算当前数字的长度
num_length = len(str(num))
# 统计当前数字中包含数字0的个数
zero_count = str(num).count('0')
# 将当前数字的长度减去包含数字0的个数,加到总操作次数中
total_steps += (num_length - zero_count)
# 返回总操作次数
return total_steps
豆包代码:
def solution(n: int, a: list) -> int:
# 初始化一个变量来存储总操作次数
total_steps = 0
# 遍历数组中的每个数字
for num in a:
# 将数字转换为字符串
num_str = str(num)
# 计算当前数字的长度
num_length = len(num_str)
# 统计当前数字中包含数字0的个数
zero_count = num_str.count('0')
# 将当前数字的长度减去包含数字0的个数,加到总操作次数中
total_steps += (num_length - zero_count)
# 返回总操作次数
return total_steps
然后我继续使用MarsCode AI进行优化我的代码,跟着豆包继续学习良好的编程习惯,在优化过程中,豆包给我提出了一些建议:
- 减少不必要的类型转换:在每次循环中,将数字转换为字符串两次(一次用于计算长度,一次用于统计0的个数)。我们可以将数字转换为字符串一次,然后复用这个字符串。 (接受建议)
- 简化代码结构:可以将一些操作合并,使代码更简洁。 (接受建议)
字典序最小的01字符串
问题描述
小U拥有一个由0和1组成的字符串,她可以进行最多k次操作,每次操作可以交换相邻的两个字符。目标是通过这些操作,使得最终得到的字符串字典序最小。
例如,小U当前有一个字符串 01010,她最多可以进行 2 次相邻字符交换操作。通过这些操作,她可以将字符串调整为 00101,这是可以通过不超过2次操作得到的字典序最小的字符串。
现在,小U想知道,经过最多k次操作后,能够得到的字典序最小的字符串是什么。
我的思路
- 从左向右遍历整个字符串
- 如果这个位置的数字是0或者这个位置是1且右边位置也是1,则遍历下一个位置的数字
- 如果这个位置是1且右边位置是0,则进行一次交换,然后遍历下一个位置的数字。
- 结束条件:遍历结束或者交换次数用完
MarsCode AI的思路
- 初始化:将字符串转换为字符数组。
- 遍历字符数组:从左到右遍历字符数组,尝试将当前位置的 '0' 尽可能地向左移动。
- 交换操作:每次找到一个 '0',尝试将其向左移动,直到达到
k次操作的限制。 - 更新操作次数:每次交换操作后,减少
k的值。 - 返回结果:将字符数组转换回字符串并返回。
思路对比:与豆包的思路进行对比之后。发现我的思路存在问题,在遇到 '1' 且右边是 '0' 时进行交换后,不能确保是最小的,可以继续检查当前位置是否可以继续向左移动 '0',直到无法再移动为止,采纳豆包的思路之后可以确保每次交换都能尽可能地将 '0' 向左移动,从而达到字典序最小的目标。
编程并使用MarsCode AI进行优化
编程之后利用豆包进行一系列的优化,得到下述代码:
def solution(n: int, k: int, s: str) -> str:
# 将字符串转换为字符数组,方便进行交换操作
chars = list(s)
# 遍历字符数组
for i in range(n):
# 如果当前字符是 '0',则尝试将其向左移动
if chars[i] == '0':
# 从当前位置向左遍历,尝试将 '0' 向左移动
for j in range(i, 0, -1):
# 如果当前位置是 '1' 且左边位置是 '0',则进行交换
if chars[j] == '0' and chars[j - 1] == '1':
# 进行交换操作
chars[j], chars[j - 1] = chars[j - 1], chars[j]
# 减少操作次数
k -= 1
# 如果操作次数用完,直接返回结果
if k == 0:
return ''.join(chars)
else:
# 如果无法继续向左移动,跳出循环
break
# 返回最终结果
return ''.join(chars)