首页 > Python基础教程 >
-
python基础教程之leepcode(斐波那契数列与float("i
12、加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
解答:
a = ''
lis1 = [] ##定义一个空字符串和一个空列表
for i in digits:
a += str(i) ##将列表里的的整数转换成字符串,并将字符串添加进空字符串a里
b = int(a) + 1 ##在将字符串a转换成整数,进行加法运算,并赋值给b。
for j in str(b): ##将整数组b进行字符串转换,并拿出每个字符串
lis1.append(int(j)) ##将字符串转换成整数,并添加进lis1的列表里
return lis1
13 、爬楼梯(该题用斐波那契数列求解)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
class Solution:
def climbStairs(self, n: int) -> int:
if n == 1:
return 1
elif n == 2:
return 2
else:
a = 1
b = 2
for i in range(n-2):
a,b = b,a+b
return b
补充点: 斐波那契数列
数列:1,1,2,3,5,8,13,21,34…n被称为斐波那契数列
特点:第一个、第二个数为1,从第三个开始,该值等于前面两个数之和。
当n>=2时,其值只与其前面两个数的值有关,所在在只需求出第n个值的时候,我们没必要浪费空间去存储在n前2个数之前的值。
14、合并两个有序数组
给定两个有序整数数组 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]
解答:
if n == 0: ##当n=0时,数组nums2为空,两组合并只有数组nums1的元素。
nums1 = nums1
j = 0 and j <n ##新设一个变量j
for i in range(m,len(nums1)): ##m代表是数组nums1的元素个数,len(nums1)代表数组nums1的索引值长度,取值范围设置到m,len(nums1)表示,可以计算出nums1中空值0的数量。
if nums1[i] == 0:
nums1[i] = nums2[j] ##每当nums1[i]等于0,就将nums2赋值给nums1
j +=1
if j == n :
break
nums1.sort() ##最后进行排序
15、买卖股票的最佳时机(用float(“inf”)无穷大来解答)
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
示例 1:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
解答:(引用float(‘inf’)无穷大的特性来比对,从而提取数组中的最小值)float(“inf”)正无穷大 float(“-inf”)负无穷大
class Solution:
def maxProfit(self, prices: List[int]) -> int:
j = 0
l = float('inf') ##float('inf')表示正无穷大
for i in prices:
l = min(l,i) ##取数组中i与正无穷大的最小值
j = max(j,i-l) ##先用i减去每次循环的最小值得到每次循环的最大值
return j
16 买卖股票的最佳时机2
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
示例 2:
输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
解答:(既然可以多次交易,那么只要每次交易都有利润,那么就能买卖,我们就可以求利润>0的总和)
class Solution:
def maxProfit(self, prices: List[int]) -> int:
j = 0
for i in range(len(prices)-1): ## 因为索引超出范围,所以要减去一个1
if prices[i+1] - prices[i]>0: ##如果每次买卖的利润>0
j += prices[i+1] -prices[i] ##将每次的利润加在一块
return (j)
17、只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
解答:**题目中提到只有不重复的元素出现一次外,所有元素均出现两次,那么先用集合去重,剩下的元素都只有一次,再把这个集合*2,那么该集合的总和就比原先的数组得总和多了一个不重复元素的值,这个值就是我们所需要的。**
class Solution:
def singleNumber(self, nums: List[int]) -> int:
return((sum(set(nums)))*2 -sum(nums))