【LeetCode】day1

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)



猜你喜欢

转载自blog.csdn.net/sinat_33969299/article/details/81049507