每日一练 — 2022.01.30


一,买卖股票的最佳时机 II

1,程序简介

  • 给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。

  • 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:

  • 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

  • 输入: prices = [7,1,5,3,6,4]
  • 输出: 7
  • 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
    随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

示例 2:

  • 输入: prices = [1,2,3,4,5]
  • 输出: 4
  • 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
    注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

  • 输入: prices = [7,6,4,3,1]
  • 输出: 0
  • 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

提示:

  • 1 < = p r i c e s . l e n g t h < = 3 ∗ 1 0 4 1 <= prices.length <= 3 * 10^4 1<=prices.length<=3104
  • 0 < = p r i c e s [ i ] < = 1 0 4 0 <= prices[i] <= 10^4 0<=prices[i]<=104

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Sun Jan 30 19:24:55 2022
Function: 买卖股票的最佳时机 II
@author: 小梁aixj
"""
class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        hold = 0
        pric = []
        temp = []
        flag = 0
        msum = 0
        if len(prices) <= 2:
            if not prices:
                return 0
            if len(prices) == 1:
                return 0
            if prices[0] > prices[1]:
                return 0
            if prices[0] < prices[1]:
                return prices[1] - prices[0]
        for i in range(len(prices) - 1):
            if prices[i + 1] > prices[i] and hold != 1:
                hold = 1
                flag = i
                continue
            if prices[i + 1] < prices[i] and hold == 1:
                pric.append(prices[flag])
                pric.append(prices[i])
                hold = 0
            else:
                continue
        for i in range(0, len(pric), 2):
            temp.append(pric[i + 1] - pric[i])
            msum = sum(temp)
        if hold == 1:
            msum = msum + prices[-1] - prices[flag]
        return msum
    
#%%
s = Solution()
print(s.maxProfit(prices = [7,1,5,3,6,4]))

3,运行结果

在这里插入图片描述

二,分数到小数

1,程序简介

  1. 给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。

  2. 如果小数部分为循环小数,则将循环的部分括在括号内。

  3. 如果存在多个答案,只需返回 任意一个 。

  4. 对于所有给定的输入,保证 答案字符串的长度小于 1 0 4 10^4 104

示例 1:

  • 输入:numerator = 1, denominator = 2
  • 输出:“0.5”

示例 2:

  • 输入:numerator = 2, denominator = 1
  • 输出:“2”

示例 3:

  • 输入:numerator = 2, denominator = 3
  • 输出:“0.(6)”

示例 4:

  • 输入:numerator = 4, denominator = 333
  • 输出:“0.(012)”

示例 5:

  • 输入:numerator = 1, denominator = 5
  • 输出:“0.2”

提示:

  • − 2 31 < = n u m e r a t o r , d e n o m i n a t o r < = 2 31 − 1 -2^{31} <= numerator, denominator <= 2^{31} - 1 231<=numerator,denominator<=2311
  • d e n o m i n a t o r ! = 0 denominator != 0 denominator!=0

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Sun Jan 30 19:26:15 2022
Function: 分数到小数
@author: 小梁aixj
"""
class Solution(object):
    def fractionToDecimal(self, numerator, denominator):
        if numerator < 0 and denominator < 0:
            numerator, denominator = -numerator, -denominator
        u = (numerator < 0) ^ (denominator < 0)
        numerator = abs(numerator)
        denominator = abs(denominator)
        numerator = numerator % denominator
        if numerator == 0:
            return str(numerator // denominator)
        s = str(abs(numerator) // denominator) + "."
        q = {}
        l = []
        while numerator < denominator:
            numerator = numerator * 10
            l.append(numerator)
            q[numerator] = numerator // denominator
        numerator = numerator % denominator * 10
        while numerator not in q and numerator != 0:
            l.append(numerator)
            q[numerator] = numerator // denominator
            numerator = numerator % denominator
            numerator = numerator * 10
        for i in range(0, len(l)):
            if numerator == l[i]:
                s = s + "("
            s = s + str(q[l[i]])
        if "(" in s:
            s = s + ")"
        if u:
            s = "-" + s
        return s
#%%
s = Solution()
print(s.fractionToDecimal(numerator = 1, denominator = 2))

3,运行结果

在这里插入图片描述

三,环形链表 II

1,程序简介

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。

说明:

  • 不允许修改给定的链表。

进阶:

  • 你是否可以使用 O(1) 空间解决此题?

示例 1:

  • 输入:head = [3,2,0,-4], pos = 1
  • 输出:返回索引为 1 的链表节点
  • 解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

  • 输入:head = [1,2], pos = 0
  • 输出:返回索引为 0 的链表节点
  • 解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

  • 输入:head = [1], pos = -1
  • 输出:返回 null
  • 解释:链表中没有环。

提示:

  • 链表中节点的数目范围在范围 [0, 1 0 4 10^4 104] 内
  • − 1 0 5 < = N o d e . v a l < = 1 0 5 -10^5 <= Node.val <= 10^5 105<=Node.val<=105
  • pos 的值为 -1 或者链表中的一个有效索引

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Sun Jan 30 19:32:36 2022
Function: 环形链表 II
@author: 小梁aixj
"""
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
class Solution(object):
    def detectCycle(self, head):
        s = set()
        node = head
        while node is not None:
            if node in s:
                return node
            else:
                s.add(node)
                node = node.next
        return None
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁辰兴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值