编程能力提升_3

目录

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

2.给定一个数组所表示的非负整数,在该数的基础上加一。

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

4.实现 int sqrt(int x) 函数。

5.假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

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

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


 

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

示例:

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

方法一:

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        #从nums的首元素开始加和,如果前面的子串的加和大于0,则保留该子串,
        #如果小于零则子串作废
        maxstr=nums[0]
        thepart=0
        for i in range(len(nums)): 
            #将thepart与当前数据加和,如果小于零,则thepart作废
            thepart+=nums[i]
            # maxstr每次都能替换保存最大子串的加和
            if thepart>maxstr:
                maxstr=thepart
            #thepart的判断,如果小于0则置0
            if thepart<0:
                thepart=0                
        return maxstr

方法二:

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
         """
        for i in range(1, len(nums)):
            nums[i]= nums[i] + max(nums[i-1], 0)
        return max(nums)
        

 

2.给定一个数组所表示的非负整数,在该数的基础上加一。

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

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

示例 1:

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
class Solution(object):
    def plusOne(self, digits):
        """
        :type digits: List[int]
        :rtype: List[int]
        """
        strs=[str(x) for x in digits]
        thenum=int(''.join(strs))+1
        return [int(x) for x in str(thenum)]

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

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

示例 1:

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

方法一:

class Solution(object):
    def addBinary(self, a, b):
        """
        :type a: str
        :type b: str
        :rtype: str
        """
        #将二进制字符串a转换成int10进制数
        #int函数将第一个参数转换成10进制,其第二个参数来说明第一个参数的进制数
        a10=int(a,2)#即将二进制的字符串a转换成10进制数
        b10=int(b,2)
        retr=a10+b10
        #bin()函数将10进制数转换成2进制数,字符串的形式
        #其前两位为0b,可以切片的方式去除
        return bin(retr)[2:]

方法二:

class Solution(object):          
    def addBinary(self, a, b):
        """
        :type a: str
        :type b: str
        :rtype: str
        """
        lena = len(a)
        lenb = len(b)

        a = a[::-1]
        b = b[::-1]
        l = max(lena,lenb)

        ans = ''
        carry = 0
        for i in range(l):
            if i >= lena:
                sum = int(b[i])+carry
            elif i >= lenb:
                sum = int(a[i])+carry
            else:
                sum = int(a[i])+int(b[i])+carry
            #在sum=0,1时,不进位,在sum=2,3时,需要进位
            #2,3时进位1,其自身变为0,1,所以用sum模2
            carry = sum//2
            ans += str(sum%2)
        if carry == 1:
            ans += '1'
        ans = ans[::-1]
        return ans

 

4.实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例 1:

输入: 4
输出: 2
class Solution:
    def mySqrt(self, x: int) -> int:
        if x<1:
            return 0
        sq=x       
        while sq > x/sq :
            sq=(sq+x/sq)//2
        return int(sq)

5.假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

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

示例 1:

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

方法一:

class Solution:
    def climbStairs(self, n: int) -> int:
        n1, n2= 1,2
        #给定n个阶梯,可以将其拆分成最后只剩一个阶梯
        #和只剩两个阶梯的情况,所以
        #f(n)=f(n-1)+f(n-2)
        i=1
        while i < n:
            n1,n2=n2,n1+n2
            i+=1
        return n1

方法二:递归,耗损计算量大,会超时

class Solution:
    def climbStairs(self, n):
        if n == 1:
            return 1
        elif n == 2:
            return 2
        else:
            return self.climbStairs(n - 1) + self.climbStairs(n - 2)

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

示例 1:

输入: 1->1->2
输出: 1->2
# 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
        """
        newhead=head
        while(head!=None and head.next!=None):
            #当前值与下一个值相等时,只修改next的指向
            if head.val==head.next.val:
                head.next=head.next.next
            #当前值与下一个值不相等时才移动head到下一个
            else:
                head=head.next
        return newhead

7.给定两个有序整数数组 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: List[int], m: int, nums2: List[int], n: int) -> None:
        while m > 0 and n >0 :
            if nums1[m-1] > nums2[n-1]:
                nums1[m+n-1] = nums1[m-1]
                m -= 1
                
            else:
                nums1[m+n-1] = nums2[n-1]
                n -=1
                
        if n > 0:
            nums1[:n] = nums2[:n]

方法二:

class Solution(object):
    def merge(self, nums1, m, nums2, n):
        for i in range(1,n+1):
            nums1[-i]=nums2[i-1]
        nums1.sort()


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值