1.移除元素(2020.1.1)
题目描述:
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
代码实现:
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
length = len(nums)
j = 0
i = 0
while j
2.搜索插入位置(2020.1.2)
题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-insert-position
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
代码实现:
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
end = len(nums) - 1
begin = 0
while begin <= end:
mid = (begin + end) // 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
end = mid - 1
else:
begin = mid + 1
return begin
3.最大子序和(2020.1.3)
题目描述:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
代码实现:
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
n = len(nums)
curr_max = sum_max = nums[0]
for i in range(1,n):
curr_max = max(nums[i], nums[i] + curr_max)
sum_max = max(sum_max, curr_max)
print(curr_max,sum_max)
return sum_max
4.最后一个单词的长度(2020.1.4)
题目描述:
给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度。
如果不存在最后一个单词,请返回 0 。
说明:一个单词是指由字母组成,但不包含任何空格的字符串。
示例:
输入: "Hello World"
输出: 5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/length-of-last-word
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
代码实现:
class Solution:
def lengthOfLastWord(self, s: str) -> int:
#去除字符串前后空格
s = s.strip()
#如果为空,返回0
if not s:
return 0
n = len(s)
while 0 <= n:
#查找最后一个空格,返回空格之后的字符串长度
if s[n-1] == ' ':
return len(s) - n
n -= 1
#如果字符一个单词,返回传入的字符串长度
else:
return len(s)
5.加一(2020.1.5)
题目描述:
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/plus-one
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
代码实现:
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
sum = 0
for i in digits:
sum = sum*10 + i
sum = str(sum + 1)
return list(sum)
6.二进制求和(2020.1.6)
题目描述:
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-binary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
代码实现:
class Solution:
def addBinary(self, a: str, b: str) -> str:
c = int(a,2) + int(b,2)
return bin(c)[2:]
7.x 的平方根
题目描述:
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
代码实现:
class Solution:
def mySqrt(self, x: int) -> int:
left = 0
right = x//2 + 1
while left < right:
mid = (left + right + 1)//2
sqrt = mid*mid
if sqrt > x:
right = mid - 1
else:
left = mid
return right
8.统计参与通信的服务器(2020.1.8)
题目描述:
这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有。
如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。
请你统计并返回能够与至少一台其他服务器进行通信的服务器的数量。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-servers-that-communicate
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
代码实现:
class Solution:
def countServers(self, grid: List[List[int]]) -> int:
count_m = list()
count_n = list()
#判断每一行出现元素1的次数,并存放在count_m
for x in range(len(grid)):
count_x = grid[x].count(1)
count_m.append(count_x)
#判断每一列出现元素1的次数,并存放在count_n
for y in range(len(grid[0])):
count_y = 0
for x1 in range(len(grid)):
if grid[x1][y] == 1:
count_y += 1
count_n.append(count_y)
sum = 0
#判断每个元素是否可以通信,如果可以,sum加1
for y in range(len(grid)):
for x in range(len(grid[y])):
if count_m[y] > 1 or count_n[x] > 1:
if grid[y][x] == 1:
sum += 1
return sum
9.爬楼梯(2020.1.9)
题目描述:
假设你正在爬楼梯。需要 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 阶
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/climbing-stairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
代码实现:
class Solution:
def climbStairs(self, n: int) -> int:
dp = [0]*(n+1)
dp[1] = 1
if n < 2:
return 1
dp[2] = 2
for i in range(3,n+1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]
10.合并两个有序数组(2020.01.10)
题目描述:
给定两个有序整数数组 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]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
代码实现:
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
p1 = 0
p2 = 0
nums1_copy = nums1[:m]
while p1