GaryLeetCode学习笔记·肆(第十三周)

58. 最后一个单词的长度

给定一个仅包含大小写字母和空格 ’ ’ 的字符串,返回其最后一个单词的长度。

如果不存在最后一个单词,请返回 0 。

说明:一个单词是指由字母组成,但不包含任何空格的字符串。

示例:

输入: “Hello World”
输出: 5

以下为上周最后提交的错误解法,郜学长指出,错误出在了line 11,j=s.index(i),它永远都是第一个空格的索引,所以造成了无法识别连续空格的情况。

class Solution(object):
    def lengthOfLastWord(self, s):
        """
        :type s: str
        :rtype: int
        """
        a=[]
        b=0
        for i in s:
            if i ==' ':
                j=s.index(i)
                a.append(j)
                b+=1
        if len(a)!=0:
            return (len(s)-a[b-1]-1)
        else:
            return 0
            

随后,郜学长给出一种思路:使用split函数,以’ '为分隔符,把字符串分割为n个子字符串,计算最后一个字符串的长度。 但应该注意,当出现以空格结尾的情况时,系统不认为不存在最后一个单词(黑人问号脸.jpg),如“a ”,最后一个单词是“a”。所以应该在split之后,remove掉新列表中的空字符串,再输出最后一个字符串的长度。

class Solution(object):
    def lengthOfLastWord(self, s):
        """
        :type s: str
        :rtype: int
        """
        a=s.find(' ')
        if a==-1:
            return len(s)
        else:
            s1=s.split(' ')
            while '' in s1:
                s1.remove('')
            if not s1:
                return 0
            else:
                return(len(s1[-1]))
                

新知识积累:

  1. Python删除包含特定值的所有列表元素
    while循环解决,while想删除内容存在时,list.remove()即可。直到全部remove完毕,退出循环。
  2. split()函数
    split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则从前往后仅分隔 num 个子字符串,返回分割后的字符串列表。

str.split(str="", num=string.count(str))
str – 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num – 分割次数。

70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶
    示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶
class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        step=[1,2]
        for i in range(2,n):
            step.append(step[i-1]+step[i-2])
        return step[n-1]

反着考虑比较好,欲达到第i阶,必先得达到第i-1阶或第i-2阶
设step[i]为达到第i+1阶的方法数,则step[i]=step[i-1]+step[i-2]

21. 合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

本题和下题都是有关于链表的题目,链表是新接触的知识。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        head = ListNode(0)
        first = head
        while l1 != None and l2 != None:
            if l1.val > l2.val:
                head.next = l2
                l2 = l2.next
            else :
                head.next = l1
                l1 = l1.next
            head = head.next
        if l1 == None:
            head.next = l2
        elif l2 == None:
            head.next = l1
        return first.next
        

head= ListNode(0)这个意思是构造一个初始节点,也就是新链表的初始节点,其实可以把head理解为根节点;接着下一步是first = head,这一步很关键,因为如果不赋值的话,让head自身去不断next传递节点关系,那根节点就找不到了,所以需要先把head保存,接着进行一个while循环,条件是l1和l2这两个节点都不能为空,也就是说在两个链表长度范围之内遍历,当l1(初始是链表1的头节点)的值小于l2的值,那就把head的指向l1;最后循环结束了,肯定是其中有一个链表被遍历完了,也就是l1或者l2传递到了这两个链表的尾节点,没法再next下去了。跳出循环,此时来到了接下来的if l1 is None:这个判断条件,我们假设遍历完以后,l2所在的链表2还有剩余的几个节点,l1所在的链表1已经遍历完了,那么head.next = l2这个意思就是把head引向l2之后的那几个节点,也就是把新链表跟剩下的链表连接起来最后return的是first.next,因为first是根节点,first.next才是头节点.

第二种方法用到了递归,程序调用自身,极大缩短了篇幅,但是我并不能很好理解这种思想,求解答。

def mergeTwoLists(self, l1, l2):  
    if not l1:  
        return l2  
    elif not l2:  
        return l1  
    else:  
        if l1.val <= l2.val:  
            l1.next = self.mergeTwoLists(l1.next, l2)  
            return l1  
        else:  
            l2.next = self.mergeTwoLists(l1, l2.next)  
            return l2 `

83. 删除排序链表中的重复元素

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:

输入: 1->1->2
输出: 1->2
示例 2:

输入: 1->1->2->3->3
输出: 1->2->3

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def deleteDuplicates(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if head is None:
            return head
        first=head
        while head.next:
            if head.val==head.next.val:
                head.next=head.next.next
            else:
                head=head.next
        return first

先判断链表是否为空,然后在while下一节点不为空时,判断头元素与头元素下一节点的值是否相等,相等则把下一节点值赋给当前节点,否则,进行下一节点的判断。返回,first。

88. 合并两个有序数组

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:

初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3

输出: [1,2,2,3,5,6]

class Solution:
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: void Do not return anything, modify nums1 in-place instead.
        """
        nums1[m:m+n]=nums2[:n]
        nums1.sort()

初始化 nums1 的元素数量分别为 m,这句话有些费解,通过看示例,大概就是取前m个元素,舍去其他的意思。
将nums1中第m+1到m+n个元素替换为nums2中前n个元素,再sort排序即可
注意题目要求

:rtype: void Do not return anything, modify nums1 in-place instead.

不返回,仅改变nums1即可。

100. 相同的树

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入: 1 1
/ \ /
2 3 2 3

    [1,2,3],   [1,2,3]

输出: true
示例 2:

输入: 1 1
/
2 2

    [1,2],     [1,null,2]

输出: false
示例 3:

输入: 1 1
/ \ /
2 1 1 2

    [1,2,1],   [1,1,2]

输出: false

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isSameTree(self, p, q):
        """
        :type p: TreeNode
        :type q: TreeNode
        :rtype: bool
        """
        if not p and not q
            return True
        if p and q and p.val==q.val:
            l=self.isSameTree(p.left,q.left)#递归,每次重新从函数入口处进行,每次进行递归边界判断
            r=self.isSameTree(p.right,q.right)
            return l and r#只用最后一次递归边界return值
        else:
            return False

先讨论两二叉树均为空的情况,返回true;从两棵树的同一位置的节点开始比较,若不同,则一定不同,返回false,若相同,以左右分支点作为新顶点采用递归,判断左右节点是否相同,仅都为true时才为true。本题的递归思想用的比较简单明了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值