2.Add Two Numbers
原题:
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807.
翻译:
给你两个非空链表,表示两个非负整数。数字以相反的顺序存储,每个节点包含一个数字。添加这两个数字并将其作为链接列表返回。
您可以假定这两个数字不包含任何前导零,除了数字0本身。
例
输入:(2→4→3)+(5→6→4) 输出: 7→0→8 说明: 342 + 465 = 807。
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
# Define this to check if it works well
def myPrint(self):
print(self.val)
if self.next:
self.next.myPrint()
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
result = ListNode(0);
cur = result;
while l1 or l2:
cur.val += self.addTwoNodes(l1, l2)
if cur.val >= 10:
cur.val -= 10
cur.next = ListNode(1)
else:
# Check if there is need to make the next node
if l1 and l1.next or l2 and l2.next:
cur.next = ListNode(0)
cur = cur.next
if l1:
l1 = l1.next
if l2:
l2 = l2.next
return result
def addTwoNodes(self, n1, n2):
if not n1 and not n2:
# This cannot happen, ignore it
None
if not n1:
return n2.val
if not n2:
return n1.val
return n1.val + n2.val
if __name_class NodeList(object):
"""docstring for NodeList"""
def __init__(self, x):
self.val=x
self.next=None
def Creatlist(n):
if n<=0:
return False
if n==1:
return ListNode(1) # 只有一个节点
else:
root=ListNode(1)
tmp=root
for i in range(2,n+1): # 一个一个的增加节点
tmp.next=ListNode(i)
tmp=tmp.next
return root # 返回根节点
class sulotion:
"""输入两个倒序链表。相加后倒叙输出"""
def addTwoNums(self,l1,l2):
'''两个链表相加'''
result=NodeList(0)
cur=result
while l1 or l2:
cur.val+=self.addTwoNode(l1,l2)
if cur.val>=10:
cur.val-=10
cur.next=NodeList(1)
else:
if l1 and l1.next or l2 and l2.next:
cur.next=NodeList(0)
cur=cur.next
if l1:
l1=l1.next
if l2:
l2=l2.next
return result
def addTwoNode(self,n1,n2):
'''两个节点相加'''
if not n1 and not n2:
return None
if not n1:
return n2.val
if not n2:
return n1.val
return n1.val+n2.val
def printList(self, head):
'''打印链表'''
p=head
while p!=None:
print(p.val)
p=p.next
def listlen(self,head):
'''链表长度 '''
c=0
p=head
while p!=None:
c=c+1
p=p.next
return c
def insert(self,head,n): # 在n的前面插入元素
if n<1 or n>listlen(head):
return
p=head
for i in range(1,n-1): # 循环四次到达 5 (只能一个一个节点的移动 range不包含n-1)
p=p.next
a=raw_input("Enter a value:")
t=ListNode(value=a)
t.next=p.next
p.next=t
return head
def dellist(self,head,n): # 删除链表
if n<1 or n>listlen(head):
return head
elif n is 1:
head=head.next # 删除头
else:
p=head
for i in range(1,n-1):
p=p.next # 循环到达 2次
q=p.next
p.next=q.next # 把5放在3的后面
return head
if __name__=="__main__":
list=NodeList(9)
list.next=NodeList(8)
sulotion().printListFromTailToHead(list)
p=sulotion().addTwoNums(list,NodeList(1))
sulotion().printListFromTailToHead(p)
# print(sulotion().addTwoNums(list, NodeList(1)))
_ == "__main__": list = ListNode(9) list.next = ListNode(8) print(Solution().addTwoNumbers(list, ListNode(1)).myPrint()) 一些链表的操作
3.Longest Substring Without Repeating Characters
原题:
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
,
which the length is 3.
Given "bbbbb"
, the answer is "b"
,
with the length of 1.
Given "pwwkew"
, the answer is "wke"
,
with the length of 3. Note that the answer must be a substring, "pwke"
is
a subsequence and not a substring.
翻译:
给定一个字符串,找到最长的子字符串的长度,不重复字符。
例子:
给定"abcabcbb"
的答案是"abc"
,长度是3。
给定"bbbbb"
的答案是"b"
,长度为1。
给定"pwwkew"
的答案是"wke"
,长度为3.请注意,答案必须是一个子字符串,"pwke"
是一个子序列,而不是一个子字符串。
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
max=0
for i in range(len(s)):
hash_map={}
count=0
for j in range(i,len(s)):
#判断是否在map的键中
if s[j] not in hash_map.keys():
#s[j]为键,count为值
hash_map[s[j]]=count
count+=1
if count>max:
max=count
else:
break
return max
if __name__=="__main__":
s=Solution().lengthOfLongestSubstring("pwwkew")
print(s)
思路二:将没有重复字符的子串称为目标字符串。遍历字符串的所有字符,记录下每个字符最近出现的下标位置,如果该下标比目标字符串的起始下标大,说明目标字符串中已经有该字符了,刷新目标字符串的起始坐标。找出所有目标串的最大长度就是题目要求的答案。
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
if not s:
return 0
if len(s) <= 1:
return len(s)
locations = [-1 for i in range(256)]
index = -1
m = 0
for i, v in enumerate(s):
if (locations[ord(v)] > index):
index = locations[ord(v)]
m = max(m, i - index)
locations[ord(v)] = i
return m
if __name__ == "__main__":
assert Solution().lengthOfLongestSubstring("abcea") == 4