打算着两个问题做个记录吧,毕竟脑子这种东西,还是没有记录下来实在,虽然问题解决之后看着简单,可是做的时候也是比较难的,都是看的题解思路。
1. 两数相加
问题描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
这个一开始我是写了两个for循环遍历,很容易想到的一个方法,但是时间很久。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
for j in range(i+1, len(nums)):
if (nums[i] + nums[j]) == target:
return i, j
执行用时 :6500 ms, 在所有 python3 提交中击败了5.02% 的用户
内存消耗 :13.6 MB, 在所有 python3 提交中击败了87.98%的用户
参照官方题解,使用哈希表,虽然我没有学过哈希表,但是他的思想大体还是可以理解的,而且在Python中没有哈希的概念,但是有字典,这里的思想就是用target-nums[keys]
看看其值所对应的下表。
这里一个细节是,把具体值作为键,把下标作为值.
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dic = {}
for index, value in enumerate(nums):
dic[value] = index
for index, value in enumerate(dic):
cache = target-value
if dic.get(cache) != None and (dic.get(cache) != dic[value]):
return dic[value], dic[cache]
emm,果然自己写还是写不对,艹,这个我想了半小时,还是没法解决输入是【3,3】的问题。还是太菜了。看大佬idea,果然还是眼高手低~~
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dic = {}
for i, num in enumerate(nums):
j = target-num
if dic.get(j) != None and dic.get(j)!=i:
return i, dic[j]
dic[num] = i
2. 反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
这里参照的一个解题思路是:将输入的有符号数统一转化成正数,因为Python中有个比较坑爹的求余机制。 先来看题解。
class Solution:
def reverse(self, x: int) -> int:
input = abs(x)
# 这里else后面不需要加 :
range = ((1<<31) -1) if x>0 else 1<<31
output=0
# 这里要用while一直循环到为0结束,不能用if.
while(input != 0):
output=output*10 + input%10
if output > range:
return 0
input = input // 10
return output if x>0 else -output
python的负数求余机制。
在Java中,对于-23%10
取余运算应该输出-3
,而在Python中,输出的却是7
, 这是因为其整除机制就不一样。
-23//10
整除运算输出的是-2
, 而在Python中-23//10
输出的却是-3
.由此,余值就不一样了。