版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。如有错误,欢迎指出,我会及时修改 https://blog.csdn.net/yukinoai/article/details/88760992
目录
35.搜索插入位置
"""
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 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
"""
def searchInsert1(nums, target):
for i in range(len(nums)):
if target == nums[i]:
return i
elif nums[i] > target:
return i
return len(nums)
def searchInsert2(nums, target):
for i, n in enumerate(nums):
if target == n:
return i
else:
if target < n:
return i
elif target > nums[-1]:
return len(nums)
a = [1, 3, 5, 6]
b = searchInsert2(a, 2)
print(a)
print(b)
38.报数
"""
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
1. 1
2. 11
3. 21
4. 1211
5. 111221
1 被读作 "one 1" ("一个一") , 即 11。
11 被读作 "two 1s" ("两个一"), 即 21。
21 被读作 "one 2", "one 1" ("一个二" , "一个一") , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
示例 1:
输入: 1
输出: "1"
示例 2:
输入: 4
输出: "1211"
"""
def countAndSay(n):
ans = "1"
n -= 1
while n > 0:
res = ""
pre = ans[0]
count = 1
for i in range(1, len(ans)):
if pre == ans[i]:
count += 1
else:
res += str(count) + pre
pre = ans[i]
count = 1
res += str(count) + pre
ans = res
n -= 1
return ans
a = countAndSay(2)
print(a)
53.最大子序和
"""
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
"""
def maxSubArray(nums):
if len(nums) == 0:
return 0
preSum = maxSum = nums[0]
for i in range(1, len(nums)):
preSum = max(preSum + nums[i], nums[i])
maxSum = max(maxSum, preSum)
return maxSum
a = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
b = maxSubArray(a)
print(b)
58.最后一个单词的长度
"""
给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度。
如果不存在最后一个单词,请返回 0 。
说明:一个单词是指由字母组成,但不包含任何空格的字符串。
示例:
输入: "Hello World"
输出: 5
"""
def lengthOfLastWord1(s):
if len(s) == 0:
return 0
s = s.split()
if len(s) > 0:
return len(s[-1])
return 0
def lengthOfLastWord2(s):
if len(s) == 0:
return 0
t = s.strip().split(" ")
return len(t[-1])
a = "a b "
b = lengthOfLastWord2(a)
print(a.strip())
print(a.strip().split(" "))
66.加一
"""
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321
"""
def plusOne1(digits):
digits = [str(i) for i in digits]
digits = int(''.join(digits))
digits += 1
digits = [int(i) for i in str(digits)]
return digits
def plusOne2(digits):
num = 0
for i in range(len(digits)):
num += digits[i] * 10 ** (len(digits) - i - 1)
num += 1
result = []
i = 1
while(num):
result.append(num % 10)
num = num // 10
i += 1
result.reverse()
return result
print(plusOne2([1, 2, 3, 4]))
67.二进制求和
"""
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
"""
def addBinary1(a, b):
a = '0b' + a
b = '0b' + b
c = eval(a + '+' + b)
d = bin(c)[2:]
return d
def addBinary2(a, b):
return bin(int(a, 2)+int(b, 2))[2:]
a = '11'
b = '1'
c = addBinary2(a, b)
print(c)
69.x的平方根
"""
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
"""
def mySqrt1(x):
"""
牛顿法
"""
a = x
y = 0
while(abs(a-y) > 1):
y = a
a = 0.5*(a + x/a)
if a > x:
return int(a) - 1
else:
return int(a)
def mySqrt2(x):
"""
二分法
"""
if x < 2:
return x
left = 0
right = x
while left <= right:
mid = (left + right) // 2
if x > mid * mid:
left = mid + 1
ans = mid
elif x < mid*mid:
right = mid - 1
else:
return mid
return ans
def mySqrt3(x):
return int(x ** 0.5)
print(mySqrt3(3))
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 阶
"""
def climbStairs(n):
pre, cur = 0, 1
for i in range(0, n):
pre, cur = cur, pre + cur
return cur
a = climbStairs(3)
print(a)
83.删除排序链表中的重复元素
"""
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
"""
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def initLink(data): # 创建新链表
a = ListNode(data[0])
p = a
# 逐个为 data 内的数据创建结点, 建立链表
for i in data[1:]:
node = ListNode(i)
p.next = node
p = p.next
p.next = None
return a
def prtLink(link): # 打印链表
a = []
while link is not None:
a.append(link.val)
link = link.next
print(a)
def deleteDuplicates1(head):
dummy = ListNode(None)
dummy.next = head
p = dummy
while p and p.next:
if p.val == p.next.val:
p.next = p.next.next
else:
p = p.next
return dummy.next
def deleteDuplicates2(head):
if head is None:
return
if head.next is None:
return head
ans = head
while 1:
if head.next.val == head.val:
head.next = head.next.next
else:
head = head.next
if head.next is None:
return ans
a = [1, 1, 2]
link = initLink(a)
prtLink(link)
link2 = deleteDuplicates2(link)
prtLink(link2)
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]
"""
def merge1(nums1, m, nums2, n):
end = m + n - 1
m -= 1
n -= 1
while end >= 0 and m >= 0 and n >= 0:
if nums1[m] > nums2[n]:
nums1[end] = nums1[m]
m -= 1
else:
nums1[end] = nums2[n]
n -= 1
end -= 1
while n >= 0:
nums1[end] = nums2[n]
end -= 1
n -= 1
def merge2(nums1, m, nums2, n):
nums1[m:m+n] = nums2[:n]
nums1.sort()
nums1 = [1, 2, 3, 0, 0, 0]
m = 3
nums2 = [2, 5, 6]
n = 3
merge2(nums1, m, nums2, n)
print(nums1)