28. 移除元素
问题描述:
···
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = “hello”, needle = “ll”
输出: 2
示例 2:
输入: haystack = “aaaaa”, needle = “bba”
输出: -1
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
···
解题思路:
- 使用列表的切片功能,找到从某一位开始,长度为len(needle)的片段与needle相同,如果有返回起始位,没有返回-1
- 注意在for循环时,不能循环到最后一位,而应该是从0到len(haystack) - len(needle) + 1 位!
代码实现:
class Solution(object):
def strStr(self, haystack, needle):
"""
:type haystack: str
:type needle: str
:rtype: int
"""
for i in range(len(haystack) - len(needle) + 1):
if haystack[i:i+len(needle)] == needle:
return i
return -1
35. 搜索插入位置
问题描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
解题思路:
- 不使用in的这种方式进行判断target是否存在于nums中,因为in本质上也是遍历
- 遍历nums,对target与nums[i]进行判断,如果target==nums[i],那么i为插入位置,如果target<nums[i],由于是有序列表,所以比对下一位
- 这样会存在一个问题是,如果target比nums中最大的还要大,那么会找不到,所以在for循环之前,判断这种情况,如果target>nums[-1],那么返回最后一位也就是nums的长度即可
代码实现:
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if target>nums[-1]:
return len(nums)
for i in range(len(nums)):
if target <= nums[i]:
return i
38. 外观数列
问题描述:
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:
1. 1
2. 11
3. 21
4. 1211
5. 111221
1 被读作 "one 1" ("一个一") , 即 11。
11 被读作 "two 1s" ("两个一"), 即 21。
21 被读作 "one 2", "one 1" ("一个二" , "一个一") , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。
注意:整数序列中的每一项将表示为一个字符串。
示例 1:
输入: 1
输出: "1"
解释:这是一个基本样例。
示例 2:
输入: 4
输出: "1211"
解释:当 n = 3 时,序列是 "21",其中我们有 "2" 和 "1" 两组,"2" 可以读作 "12",也就是出现频次 = 1 而 值 = 2;类似 "1" 可以读作 "11"。所以答案是 "12" 和 "11" 组合在一起,也就是 "1211"。
解题思路
- 题意说明:初始字符串为1,当输入为1时,返回1;输入为2时,返回对上一个字符串的描述:一个1,就是11;输入为3是,返回对11的描述:两个1,就是21…以此类推
- 因为n是变量,且只能通过前一个字符串获得下一次字符串的描述,所以定义一个方法getNext,其意义就是获取对前一个字符串的描述
- 写一个for循环,写一个递归方法,每次讲上一次得出的结果传递回去。因为for循环中i是从0开始,而题中是从1开始,所以for i in range(n-1)
- getNext方法为:遍历给定字符串的每一位,再次遍历在给定字符串中,有多少个相同值。方法为:判断这位与下一位是否相同,如果相同就是count个;如果不同(如1,2),则跳出循环,count重置为1,计算不同的这位数字的个数,并将之前那位的count与value合并成字符串然后存储起来–>next_m。 然后继续下一位的计数。
代码实现:
class Solution(object):
def countAndSay(self, n):
"""
:type n: int
:rtype: str
"""
m = '1'
for i in range(n-1):
m = self.getNext(m)
return m
def getNext(self,m):
i,next_m = 0,""
while i < len(m):
count = 1
while i<len(m)-1 and m[i] == m[i+1]:
count += 1
i+=1
next_m += str(count)+m[i]
i += 1
return next_m
尽量保证每天更新!有兴趣可以关注一下!
如果哪些地方有错误或者您有更好的解法,劳烦指出!大家共同进步,感谢!