LeetCode(Python实现)——Easy部分【Day4】

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() 定义相符。
···

解题思路:
  1. 使用列表的切片功能,找到从某一位开始,长度为len(needle)的片段与needle相同,如果有返回起始位,没有返回-1
  2. 注意在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
解题思路:
  1. 不使用in的这种方式进行判断target是否存在于nums中,因为in本质上也是遍历
  2. 遍历nums,对target与nums[i]进行判断,如果target==nums[i],那么i为插入位置,如果target<nums[i],由于是有序列表,所以比对下一位
  3. 这样会存在一个问题是,如果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时,返回1;输入为2时,返回对上一个字符串的描述:一个1,就是11;输入为3是,返回对11的描述:两个1,就是21…以此类推
  2. 因为n是变量,且只能通过前一个字符串获得下一次字符串的描述,所以定义一个方法getNext,其意义就是获取对前一个字符串的描述
  3. 写一个for循环,写一个递归方法,每次讲上一次得出的结果传递回去。因为for循环中i是从0开始,而题中是从1开始,所以for i in range(n-1)
  4. 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

尽量保证每天更新!有兴趣可以关注一下!
如果哪些地方有错误或者您有更好的解法,劳烦指出!大家共同进步,感谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值