由于技术原因 部分题解我是看了大神之后做的 也有复制粘贴 见谅~
#1 两数之和
第一种思路
使用双重for循环,nums的每一个元素开始与它后面的每一个元素相加,如果等于target,则返回下标index,不等于target,则继续循环,如果这个元素跟后面的元素相加都不符合条件,就从它的下一个元素开始重复刚刚的步骤,直到符合条件为止。这个时间复杂度比较高
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
x = []
for i in range(0,len(nums)):
for a in range(i+1,len(nums)):
if nums[i] + nums[a] == target:
x = [i,a]
return x
break
else:
continue
第二种思路
通过字典的方法实现。
在Python3中有一个enumerate()的函数。
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
遍历字典,通过target-num得出another_num的数值,判断another_num是否在字典中。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dict = {}
for index, num in enumerate(nums):
another_num = target - num
if another_num in dict:
return [dict[another_num], index]
dict[num] = index
return None
#2 两数相加
思路
因为加法里会有进位,所以我们先设置一个carry变量用来保存进位的。ListNode(0)是用来初始化声明一个单链表的。ptr暂时理解为C语言的指针。
进入循环,开始进行相加。用ptr来保存结果,carry跟10整除,记录进位。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
head = ListNode(0)
carry = 0
ptr = head
while True:
if l1 != None:
carry += l1.val
l1 = l1.next
if l2 != None:
carry += l2.val
l2 = l2.next
ptr.val = carry % 10
carry //= 10
if l1 != None or l2 != None or carry != 0:
ptr.next = ListNode(0)
ptr = ptr.next
else:
break
return head
#7 整数翻转
思路
将输入的字符串x变为str类型,因为可能存在负数,先将负号去掉,利用[-1::-1]将字符串翻转。判断原始字符串x是否为正整数,是的话直接返回,否则添加一个负号。
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
str_x = str(x)[-1::-1].rstrip('-')
if int(str_x) < 2**31:
if x >=0:
return int(str_x)
else:
return 0-int(str_x)
return 0
#9 回文数
思路
这题so easy,就把输入的x转换成字符串翻转,再进行条件判断就ok了。
class Solution(object):
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
reverse_x = str(x)[::-1]
if x >= 0 and x == int(reverse_x):
return True
else:
return False