leetcode 騰訊 2018 秋招精選(50 題)Easy Part (4)
阿新 • • 發佈:2018-12-13
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 階
思路:斐波那契數列
class Solution(object): def climbStairs(self, n): """ :type n: int :rtype: int """ # 前三種情況 res = [0, 1, 2] for i in range(3, len(n)): res.append(res[i - 1] + res[i - 2]) return res[n]
231. 2的冪
給定一個整數,編寫一個函式來判斷它是否是 2 的冪次方。
示例 1:
輸入: 1 輸出: true 解釋: 20 = 1
示例 2:
輸入: 16 輸出: true 解釋: 24 = 16
示例 3:
輸入: 218 輸出: false
# -*- coding:utf-8 -*- """ 判斷一個整數是不是2的冪,可根據二進位制來分析。2的冪如2,4,8,等有一個特點: 二進位制數首位為1,其他位為0,如2為10,4為100 2&(2-1)=0 4&(4-1)=0 即得出結論如果一個數n為2的冪,則n & (n-1)=0 """ class Solution(object): def isPowerOfTwo(self, n): """ :type n: int :rtype: bool """ if n <= 0: return False return n & (n - 1) == 0
26. 刪除排序陣列中的重複項
給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。
不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 O(1) 額外空間的條件下完成。
示例 1:
給定陣列 nums = [1,1,2], 函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改為1
2。
你不需要考慮陣列中超出新長度後面的元素。
示例 2:
給定 nums = [0,0,1,1,1,2,2,3,3,4],
函式應該返回新的長度 5, 並且原陣列 nums 的前五個元素被修改為 0, 1, 2, 3, 4。
你不需要考慮陣列中超出新長度後面的元素。
說明:
為什麼返回數值是整數,但輸出的答案是陣列呢?
請注意,輸入陣列是以“引用”方式傳遞的,這意味著在函式裡修改輸入陣列對於呼叫者是可見的。
你可以想象內部操作如下:
// nums 是以“引用”方式傳遞的。也就是說,不對實參做任何拷貝 int len = removeDuplicates(nums); // 在函式裡修改輸入陣列對於呼叫者是可見的。 // 根據你的函式返回的長度, 它會打印出陣列中該長度範圍內的所有元素。 for (int i = 0; i < len; i++) { print(nums[i]); }
思路:這裡只要求返回刪除重複陣列後新陣列的長度,換句話說也就是原陣列出現不同數字的個數。
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) <= 1:
return len(nums)
s = 0
for i in range(1, len(nums)):
# 統計陣列中不同數字出現的個數
if nums[s] != nums[i]:
s += 1
nums[s] = nums[i]
return s + 1
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]
思路:將陣列1向後彈出陣列2長度的0,然後向陣列1中新增陣列2元素,合併成一個新的陣列。
class Solution(object):
def merge(self, nums1, m, nums2, n):
"""
:type nums1: List[int]
:type m: int
:type nums2: List[int]
:type n: int
:rtype: void Do not return anything, modify nums1 in-place instead.
"""
for i in range(n):
num1.pop()
for j in nums2:
num1.append(j)
num1.sort()
53. 最大子序和
給定一個整數陣列 nums
,找到一個具有最大和的連續子陣列(子陣列最少包含一個元素),返回其最大和。
示例:
輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。
進階:
如果你已經實現複雜度為 O(n) 的解法,嘗試使用更為精妙的分治法求解。
思路:對陣列中的數進行累加,若累加結果小於0,則將結果置0,繼續累加,每次累加和都和最大值做比較。
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
res = 0
# 將比較的置一個最小的整數
maxn = -2147483647
for i in range(len(nums)):
if res < 0:
res = 0
res += nums[i]
maxn = max(maxn, res)
return maxn