斐波那契數列、(引用float(‘inf’)無窮大的特性來比對,從而提取數組中的最小值)float(“inf”)正無窮大 float(“-inf”)負無窮大 ...
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))