本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《482. 密钥格式化、485.最大连续1的个数、492. 构造矩形》。
482. 密钥格式化
题目描述
给定一个许可密钥字符串 s ,仅由字母、数字字符和破折号组成。字符串由 n 个破折号分成 n + 1 组。你也会得到一个整数 k 。
我们想要重新格式化字符串 s ,使每一组包含 k 个字符,除了第一组,它可以比 k 短,但仍然必须包含至少一个字符。此外,两组之间必须插入破折号,并且应该将所有小写字母转换为大写字母。
返回 重新格式化的许可密钥 。
示例 1:
输入:S = "5F3Z-2e-9-w", k = 4 输出:"5F3Z-2E9W" 解释:字符串 S 被分成了两个部分,每部分 4 个字符; 注意,两个额外的破折号需要删掉。
示例 2:
输入:S = "2-5g-3-J", k = 2 输出:"2-5G-3J" 解释:字符串 S 被分成了 3 个部分,按照前面的规则描述,第一部分的字符可以少于给定的数量,其余部分皆为 2 个字符。
解题思路
首先还是遍历整个字符串,将非连接符的元素取出来,转为大写的字符串存入目标列表中,用目标列表除以k计算出能够有多少个完整的子字符串,那么剩下的就是第一个字符串,用指针从第一个子字符串向后面遍历,将列表切割之后用jion方法连接在一起,再加上连接符,最终返回整合的字符串。最上面要先判断是否字符串即为连接符以及字符串长度为1的情况。
解题代码
def licenseKeyFormatting(s, k):
if s == "-":
return ""
if len(s) == 1:
return s.upper()
target_list = []
for i in s:
if i != "-":
target_list.append(i.upper())
# 计算可以分成几个完整的
num = len(target_list)//k
index_p = len(target_list) - num * k
first = target_list[:index_p]
fin_str = ""
fin_str +="".join(first)
if first != []:
fin_str += "-"
while index_p +k <= len(target_list):
fin_str += "".join(target_list[index_p:index_p+k])
fin_str += "-"
index_p += k
return fin_str[:len(fin_str)-1]
485.最大连续1的个数
题目描述
给定一个二进制数组 nums , 计算其中最大连续 1 的个数。
示例 1:
输入:nums = [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.
示例 2:
输入:nums = [1,0,1,1,0,1] 输出:2
解题思路
这题用的还是字符串的切割,将列表转化为字符串,以“0”为切割的依据,返回一个列表对象,最终返回这个列表中最大值的长度,即为连续1的最大值。
解题代码
def findMaxConsecutiveOnes(nums):
if 1 not in nums:
return 0
num_list = [str(i) for i in nums]
num_str = "".join(num_list)
num_split = num_str.split("0")
return len(max(num_split))
492. 构造矩形
题目描述
作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的。 所以,现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求:
你设计的矩形页面必须等于给定的目标面积。
宽度 W 不应大于长度 L ,换言之,要求 L >= W 。
长度 L 和宽度 W 之间的差距应当尽可能小。
返回一个 数组 [L, W] ,其中 L 和 W 是你按照顺序设计的网页的长度和宽度。
示例1:
输入: 4 输出: [2, 2] 解释: 目标面积是 4, 所有可能的构造方案有 [1,4], [2,2], [4,1]。 但是根据要求2,[1,4] 不符合要求; 根据要求3,[2,2] 比 [4,1] 更能符合要求. 所以输出长度 L 为 2, 宽度 W 为 2。
示例 2:
输入: area = 37 输出: [37,1]
示例 3:
输入: area = 122122 输出: [427,286]
解题思路
首先想到的是暴力循环,直接两个for循环加上一个字典的索引就可以了,但是我怕大数会报时间错误,先试一下。
解题代码
def constructRectangle(area):
fin_dic = {}
for i in range(1,area+1):
for j in range(1,i):
if i*j == area:
fin_dic[abs(i-j)] = [i,j]
min_result = min(list(fin_dic.keys()))
return fin_dic[min_result]
果然,测试集的大数都直接报错了。
L∗W=area 且 L>=W
于是可以得到 W∗W<=area
贪心地求得 w 的最大值,就可以得到题目要求的答案,L和W之间的差距尽可能小,同时又等于 area
import math
def constructRectangle(area):
w = int(math.sqrt(area))
while area % w:
w -= 1
return [area // w, w]