1. 两数之和
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
result = []
for index1 in range(len(nums)):
for index2 in range(len(nums)):
if (nums[index1] + nums[index2] == target and index1 != index2):
result.append(index1)
result.append(index2)
return result
注:python string index() :当字符串中有重复字符中index()返回第一个
index()与find()的区别在于 找不到子串index()会抛出异常而find()会返回-1
2. 两数相加
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
扫描二维码关注公众号,回复:
2430700 查看本文章
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def listToInt(self,l1):
a = l1
len = 0
while a is not None:
len += 1
a = a.next
sum = 0
b = l1
for i in range(len):
sum += pow(10,i) * b.val
b = b.next
return sum
def intToList(self,sum):
temp = sum
head = ListNode(temp % 10)
a = head
temp = int(temp / 10)
while(temp != 0):
b = ListNode(temp % 10)
a.next = b
a = b
temp = int(temp / 10)
return head
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
sum = self.listToInt(l1) + self.listToInt(l2)
return self.intToList(sum)
3. 无重复字符的最长子串
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "abcabcbb"
,没有重复字符的最长子串是 "abc"
,那么长度就是3。
给定 "bbbbb"
,最长的子串就是 "b"
,长度是1。
给定 "pwwkew"
,最长子串是 "wke"
,长度是3。请注意答案必须是一个子串,"pwke"
是 子序列 而不是子串。
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
maxlen = 0
start = 0
one_len = 0
d = {}
for index in range(len(s)):
if (s[index] in d and d[s[index]] >= start):
start = d[s[index]] + 1
d[s[index]] = index
one_len = index - start + 1
maxlen = max(one_len,maxlen)
return maxlen
这个题开始的思路:滑动窗口遍历 超时
后来优化滑动窗口 因为当(i,j-1)中出现重复字符s[j](重复字符位置为h)时 包含h位置的字符串遍历到j位置必然出现重复,所以下一次遍历应从h+1位置开始 但这个方法还是超时
最后查了一下 一个比较好的答案 是遍历一遍字符串 建立字符集 把每一个字符的最后出现位置h记录下来 如果出现了重复字符 就重置字符串开始的位置为h+1 计算当前所在位置生成的字符串长度 只需遍历一遍字符串 复杂度为O(n)