LeetCode算法题解答
经过某公司的线上机试,痛定思痛,开个坑刷LeetCode,大部分是自己想的,卡几个小时的就会看别人解答了,呜呜呜,有些时候感觉,一个看起来挺直白的东西,写程序实现怎么这么麻烦=-=,还是自己太菜了的缘故。先刷腾讯精选50题,不定期更新。
第四题:寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
代码:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
from math import floor
nums1.extend(nums2)
nums1.sort()
k = len(nums1)
mid = 0
if (k % 2) == 0 :
mid = (nums1[floor(k/2-1)] + nums1[floor(k/2)])/2
else:
mid =nums1[floor(k/2)]
return float(mid)
第七题:整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
代码:
def reverse(self, x: int) -> int:
y = list(map(int, str(abs(x))))
y.reverse()
while True:
if y == []:
return 0
if y[0] == 0 :
y.pop(0)
else:
break
k = str(y[0])
for i in range(1, len(y)):
k = k + str(y[i])
if int(k) > 2147483647:
return 0
else:
if x >= 0:
return int(k)
else:
return -int(k)
第八题:字符串转换正数
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,qing返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
代码:写了半天,弄出来的太蠢了,自己看不下去了,看了下别人的解答,十行代码等于自己的100行…学习了一个正则,再开个坑学习什么正则=-=。。。
def myAtoi(self, str: str) -> int:
import re
renum = re.findall("(^[\d\-\+]?\d+)", str.strip())
if renum == []:
return 0
else:
if "-" in renum[0]:
return max(int(renum[0]), - (2 ** 31))
else:
return min(int(renum[0]), 2 ** 31 - 1)
第九题:回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
代码:
def isPalindrome(self, x: int) -> bool:
if x < 0:
return False
y = list(map(int, str(x)))
z = y.copy()
y.reverse()
if y == z:
return True
else:
return False
第十一题:盛水最多的容器
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
代码:
def maxArea(self, height: List[int]) -> int:
l = 0
r = len(height) - 1
max_v = 0
while l < r:
if height[l] < height[r]:
temper_v = (r- l)*height[l]
l = l + 1
else:
temper_v = (r- l)*height[r]
r = r - 1
if max_v < temper_v:
max_v = temper_v
return max_v