LeetCode——难度等级Easy的前10~20道题(题号35~88)

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。如有错误,欢迎指出,我会及时修改 https://blog.csdn.net/yukinoai/article/details/88760992

目录

35.搜索插入位置

38.报数

53.最大子序和

58.最后一个单词的长度

66.加一

67.二进制求和

69.x的平方根

70.爬楼梯

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

88.合并两个有序数组


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
"""


def searchInsert1(nums, target):
    for i in range(len(nums)):
        if target == nums[i]:
            return i
        elif nums[i] > target:
            return i
    return len(nums)


def searchInsert2(nums, target):
    for i, n in enumerate(nums):
        if target == n:
            return i
        else:
            if target < n:
                return i
            elif target > nums[-1]:
                return len(nums)



a = [1, 3, 5, 6]
b = searchInsert2(a, 2)
print(a)
print(b)

38.报数

"""
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

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"
"""


def countAndSay(n):
    ans = "1"
    n -= 1
    while n > 0:
        res = ""
        pre = ans[0]
        count = 1
        for i in range(1, len(ans)):
            if pre == ans[i]:
                count += 1
            else:
                res += str(count) + pre
                pre = ans[i]
                count = 1
        res += str(count) + pre
        ans = res
        n -= 1
    return ans


a = countAndSay(2)
print(a)

53.最大子序和

"""
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
"""


def maxSubArray(nums):
    if len(nums) == 0:
        return 0
    preSum = maxSum = nums[0]
    for i in range(1, len(nums)):
        preSum = max(preSum + nums[i], nums[i])
        maxSum = max(maxSum, preSum)
    return maxSum


a = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
b = maxSubArray(a)
print(b)

58.最后一个单词的长度

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

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

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

示例:

输入: "Hello World"
输出: 5
"""


def lengthOfLastWord1(s):
    if len(s) == 0:
        return 0
    s = s.split()
    if len(s) > 0:
        return len(s[-1])
    return 0


def lengthOfLastWord2(s):
    if len(s) == 0:
        return 0
    t = s.strip().split(" ")
    return len(t[-1])


a = "a b "
b = lengthOfLastWord2(a)
print(a.strip())
print(a.strip().split(" "))

66.加一

"""
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:

输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321
"""


def plusOne1(digits):
    digits = [str(i) for i in digits]
    digits = int(''.join(digits))
    digits += 1
    digits = [int(i) for i in str(digits)]
    return digits


def plusOne2(digits):
    num = 0
    for i in range(len(digits)):
        num += digits[i] * 10 ** (len(digits) - i - 1)
    num += 1
    result = []
    i = 1
    while(num):
        result.append(num % 10)
        num = num // 10
        i += 1
    result.reverse()
    return result


print(plusOne2([1, 2, 3, 4]))

67.二进制求和

"""
给定两个二进制字符串,返回他们的和(用二进制表示)。

输入为非空字符串且只包含数字 1 和 0。

示例 1:

输入: a = "11", b = "1"
输出: "100"
示例 2:

输入: a = "1010", b = "1011"
输出: "10101"
"""


def addBinary1(a, b):
    a = '0b' + a
    b = '0b' + b
    c = eval(a + '+' + b)
    d = bin(c)[2:]
    return d


def addBinary2(a, b):
    return bin(int(a, 2)+int(b, 2))[2:]


a = '11'
b = '1'
c = addBinary2(a, b)
print(c)

69.x的平方根

"""
计算并返回 x 的平方根,其中 x 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例 1:

输入: 4
输出: 2
示例 2:

输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
     由于返回类型是整数,小数部分将被舍去。
"""


def mySqrt1(x):
    """
    牛顿法
    """
    a = x
    y = 0
    while(abs(a-y) > 1):
        y = a
        a = 0.5*(a + x/a)
    if a > x:
        return int(a) - 1
    else:
        return int(a)


def mySqrt2(x):
    """
    二分法
    """
    if x < 2:
        return x
    left = 0
    right = x
    while left <= right:
        mid = (left + right) // 2
        if x > mid * mid:
            left = mid + 1
            ans = mid
        elif x < mid*mid:
            right = mid - 1
        else:
            return mid
    return ans



def mySqrt3(x):
    return int(x ** 0.5)


print(mySqrt3(3))

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 阶
"""


def climbStairs(n):
    pre, cur = 0, 1
    for i in range(0, n):
        pre, cur = cur, pre + cur
    return cur


a = climbStairs(3)
print(a)

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

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

示例 1:

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

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


class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None


def initLink(data):  # 创建新链表
    a = ListNode(data[0])
    p = a
    # 逐个为 data 内的数据创建结点, 建立链表
    for i in data[1:]:
        node = ListNode(i)
        p.next = node
        p = p.next
    p.next = None
    return a


def prtLink(link):  # 打印链表
    a = []
    while link is not None:
        a.append(link.val)
        link = link.next
    print(a)


def deleteDuplicates1(head):
    dummy = ListNode(None)
    dummy.next = head
    p = dummy
    
    while p and p.next:
        if p.val == p.next.val:
            p.next = p.next.next
        else:
            p = p.next
    return dummy.next


def deleteDuplicates2(head):
    if head is None:
        return
    if head.next is None:
        return head
    ans = head
    while 1:
        if head.next.val == head.val:
            head.next = head.next.next
        else:
            head = head.next
        if head.next is None:
            return ans


a = [1, 1, 2]
link = initLink(a)
prtLink(link)
link2 = deleteDuplicates2(link)
prtLink(link2)

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]
"""


def merge1(nums1, m, nums2, n):
    end = m + n - 1
    m -= 1
    n -= 1
    while end >= 0 and m >= 0 and n >= 0:
        if nums1[m] > nums2[n]:
            nums1[end] = nums1[m]
            m -= 1
        else:
            nums1[end] = nums2[n]
            n -= 1
        end -= 1

    while n >= 0:
        nums1[end] = nums2[n]
        end -= 1
        n -= 1


def merge2(nums1, m, nums2, n):
    nums1[m:m+n] = nums2[:n]
    nums1.sort()


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

merge2(nums1, m, nums2, n)
print(nums1)

猜你喜欢

转载自blog.csdn.net/yukinoai/article/details/88760992