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的情况。
解题代码
1. def licenseKeyFormatting(s, k): 2. if s == "-": 3. return "" 4. if len(s) == 1: 5. return s.upper() 6. target_list = [] 7. for i in s: 8. if i != "-": 9. target_list.append(i.upper()) 10. # 计算可以分成几个完整的 11. num = len(target_list)//k 12. index_p = len(target_list) - num * k 13. first = target_list[:index_p] 14. fin_str = "" 15. fin_str +="".join(first) 16. if first != []: 17. fin_str += "-" 18. while index_p +k <= len(target_list): 19. fin_str += "".join(target_list[index_p:index_p+k]) 20. fin_str += "-" 21. index_p += k 22. 23. 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的最大值。
解题代码
1. def findMaxConsecutiveOnes(nums): 2. if 1 not in nums: 3. return 0 4. num_list = [str(i) for i in nums] 5. num_str = "".join(num_list) 6. num_split = num_str.split("0") 7. 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循环加上一个字典的索引就可以了,但是我怕大数会报时间错误,先试一下。
解题代码
1. def constructRectangle(area): 2. fin_dic = {} 3. for i in range(1,area+1): 4. for j in range(1,i): 5. if i*j == area: 6. fin_dic[abs(i-j)] = [i,j] 7. min_result = min(list(fin_dic.keys())) 8. return fin_dic[min_result]
果然,测试集的大数都直接报错了。
L∗W=area 且 L>=W
于是可以得到 W∗W<=area
贪心地求得 w 的最大值,就可以得到题目要求的答案,L和W之间的差距尽可能小,同时又等于 area
1. import math 2. def constructRectangle(area): 3. w = int(math.sqrt(area)) 4. while area % w: 5. w -= 1 6. return [area // w, w]