1. 两数之和
参考别人的之后才了解到字典的一些操作
1.对于数组(或者将数组里的内容放置在字典),查找一个东西是否存在,比从头到尾把每一个东西找出来看看这个东西是不是想要的要快,查找是否存在的过程相当于一个计算量少的for循环。
2.如果需要知道数组中的数的位置,那么就把数组转换成字典
3.为什么字典比for循环快?因为字典用的是哈希算法,哈希算法到底怎么个快法?
2. 两数相加
不知道如何构建链表,参考别人的之后并问了同学才知道python可/不可变量的概念
1.链表构建的过程就是不断让链表节点的next成为新的链表节点的过程
2.为什么一开始ansNode=newNode之后,除了最后的return外,也没有对ansNode的操作,而ansNode的内容却一直在增加,为什么?因为python在新建变量的时候,如果该变量的值是可变量且与之前已有变量值相同,那么新建的变量会指向以前的变量
可变量传址(dict,list,set是可变变量),不可变量(数字,元祖)传值,自定义的属于可变量
不可变量之所以叫不可变量,是因为不可变量在变化的时候并没有去改值,而是改了一个id,相对的可变量变化时并没有改id,而是改了值,这个id可以理解成指针里的地址
a = [1,2]
c=a
c[0]=10
print(a)
print(c)
结果:
[10,2]
[10,2]
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
newNode=ListNode(0)
ansNode=newNode
flag=-1
while l1 or l2 or flag:
if flag!=-1:
newNode.next=ListNode(0)
newNode=newNode.next
else:
flag=0
if l1 and l2:
sum=l1.val+l2.val
l1=l1.next
l2=l2.next
elif l1:
sum=l1.val
l1=l1.next
elif l2:
sum=l2.val
l2=l2.next
else:
sum=0
newNode.val=(sum+1)%10 if flag==1 else sum%10
flag=1 if sum+flag>9 else 0
return ansNode
3. 无重复字符的最长子串
无重复字符的最长子串
思路:
从0到最后,遍历字符串,遍历过程中,如果发现新进来的字符已经在以前的字符串中出现过,那么就把子字符串的头部改为与新字符相同的已有字符在子字符串中的位置的后一位,并把新进来的字符作为最后一位,相当于整体子字符串缩短长度并改变在原字符串中的位置,如果没有出现过,直接接在最后一位,每次加一位都统计字符串的长度,记录最长的长度
注意:
str.find(str, beg=0, end=len(string))
返回的是找到第一个匹配的东西的位置,如果str中有多个符合搜索条件的结果,那么只返回第一个找到的结果的位置
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
max_l = 0
sub_str=""
j = 0
for i in range(len(s)):
if (i+j) >= len(s):
break
for j in range(len(s)-i-j):
if (i+j) >= len(s):
break
if s[i+j] in sub_str:
#l = len(sub_str)
sub_str=sub_str[sub_str.find(s[i+j])+1:] + s[i+j]
#i = i + sub_str.find(s[i + j])
else:
sub_str = sub_str + s[i+j]
l = len(sub_str)
if max_l < l:
max_l = l
return max_l
5. 最长回文子串
(没做出来,不知道怎么用编程语言用简洁的方式描述最长回文子串,因此怎么找也不会,看了解析,不会动态规划)
思路:
从左到右遍历字符串的每一个字符,遍历到第i个字符时,以i为中心,设定双指针,一个向左,一个向右,找到最长的回文字符串,注意回文字符串分奇偶,奇字符串左右指针都从i开始,偶字符串左从i开始,右从i+1开始,每个字符i都要找奇和偶两种情况。
7. 整数反转
自己做的,但是解析有更好的,不知道字符串可以翻转操作
整数反转
python中,字符串,列表,元祖倒叙输出可以用str[::-1]
1、例如:s='abadb'
print(s[::-1])输出结果为:bdaba