leetcode_6: 报数(38)、最大子序和(53)、最后一个单词的长度(58)

leetcode_6: 报数(38)、最大子序和(53)、最后一个单词的长度(58)
1.报数38报数序列是一个整数序列按照其中的整数的顺序进行报数得到下一个数。其前五项如下1. 12. 113. 214. 12115. 1112211 被读作 one 1 (一个一) , 即 11。11 被读作 two 1s (两个一, 即 21。21 被读作 one 2, one 1 一个二 , 一个一) , 即 1211。给定一个正整数 n1 ≤ n ≤ 30输出报数序列的第 n 项。注意整数顺序将表示为一个字符串。这道题不是很好理解其就是根据上一个数的描述来写出下一个数比如1211的描述是 1个1、1个2、2个1那么下一个数就是111221思路每次外循环含义为给定上一个人报的数求下一个人报的数每次内循环为遍历上一个人报的数具体思路先设置上一人为1开始外循环每次外循环先置下一人为空字符串置待处理的字符num为上一人的第一位置记录出现的次数为1开始内循环遍历上一人的数如果数是和num一致则count增加。若不一致则将count和num一同添加到next_person报的数中同时更新num和count别忘了更新next_person的最后两个数为上一个人最后一个字符以及其出现次数class Solution: def countAndSay(self, n: int) - str: last_per 1 for i in range(1,n): next_per first last_per[0] count 1 for j in range(1,len(last_per)): if last_per[j] first: count 1 else: next_per str(count) first count 1 first last_per[j] next_per str(count) first last_per next_per return last_per参考链接https://leetcode-cn.com/problems/count-and-say/solution/ji-su-jie-bu-di-gui-zhi-ji-lu-qian-hou-liang-ren-p/2.最大子序和53给定一个整数数组nums找到一个具有最大和的连续子数组子数组最少包含一个元素返回其最大和。思路动态规划首先对数组进行遍历当前最大连续子序列和为 sum结果为 ans如果 sum 0则说明 sum 对结果有增益效果则 sum 保留并加上当前遍历数字如果 sum 0则说明 sum 对结果无增益效果需要舍弃则 sum 直接更新为当前遍历数字每次比较 sum 和 ans的大小将最大值置为ans遍历结束返回结果class Solution: def maxSubArray(self, nums: List[int]) - int: sum_sublist 0; #最大连续子序列的和 ans nums[0] #最终的结果 for i in range(len(nums)): if sum_sublist 0: #如果大于0则对结果有增益 sum_sublist nums[i] else: sum_sublist nums[i] #小于0则对结果无增益从新的元素开始 ans max(ans,sum_sublist) return ans参考链接https://leetcode-cn.com/problems/maximum-subarray/solution/hua-jie-suan-fa-53-zui-da-zi-xu-he-by-guanpengchn/3.最后一个单词的长度58给定一个仅包含大小写字母和空格 的字符串返回其最后一个单词的长度。如果不存在最后一个单词请返回 0 。说明一个单词是指由字母组成但不包含任何空格的字符串。思路把字符串首尾的空格去掉排除尾部含有空格的字符串得到的字符串有两种情况空的字符串长度为0这类字符它的最后面不存在单词直接return 0;不空的字符串长度不为0 它的最后一个单词为s.split( )[-1]直接返回这个单词的lengthclass Solution: def lengthOfLastWord(self, s: str) - int: s s.rstrip() if len(s) ! 0: return len(s.split( )[-1]) else: return 0知识点rstrip() 方法用于移除字符串尾指定的字符默认为空格或换行符或字符序列。split()通过指定分隔符对字符串进行切片如果参数 num 有指定值则分隔 num1 个子字符串. str.split(str, numstring.count(str)).不使用内置函数的解法使用一个标志位来判断当前找到的空格是否是尾部的。如果不是说明尾部单词记录完毕如果是则继续往前遍历。class Solution: def lengthOfLastWord(self, s: str) - int: count 0 flag 0 for i in range(len(s)-1,-1,-1): if s[i] ! : #当从尾部找到字母则标志位置1 count 1 flag 1 if s[i] and flag 0: #如果是尾部的空格则继续向前遍历 continue if s[i] and flag 1: #不是尾部的空格说明最后一个单词记录完毕跳出。 break return count参考链接https://leetcode-cn.com/problems/length-of-last-word/solution/zui-hou-yi-ge-dan-ci-de-chang-du-by-balconyang/