3.无重复字符的最长子串

题目:

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

思路(2条):

  1. 暴力破解

    遍历字符串所有子串,再判断每个字串是否含有重复字符,然后返回最长的无重复字符的子串长度,这个的时间复杂度是O(n)*O(n2)=O(n3),空间复杂度O(m), 其时间复杂度明显没办法被人接受。

  2. 滑动窗口

    滑动窗口在计算机中非常常见。该算法可以通过滑动将两重循环降低到单重循环,从而降低时间复杂度为O(n)。

    针对某个给定的字符串,我们指定两个辅助指针,begin和end,开始的时候,begin和end都指向字符串中第一个字符,然后end向后移动。这个过程中,借助一个字典来存储end经过的字符串和它的位置。

    每当end的值已存在在字典里时,就说明出现了重复字符。此时begin移到end后边,end重新开始计数。以此类推,循环完毕后,返回最大的长度数即可。

    代码如下:

    class Solution:
        def lengthOfLongestSubstring(self, s: str) -> int:
            '''
            时间复杂度:O(n)
            空间复杂度:O(m),m为给定字符串长度
            '''
            ans = 0
            d = {}
            begin, end = 0, 0
            n = len(s)
            while end < n:
                last = d.get(s[end])
                d[s[end]] = end
                if last is not None:
                    ans = max(ans, end - begin)
                    begin = max(begin, last + 1)
                end += 1
            ans = max(ans, end - begin)
            return ans
    
    

 

7. 整数反转

题目:

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例1:

输入: 123
输出: 321

示例2:

输入: -123
输出: -321

示例3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

思路:

首先这个数字符号不确定,所以最好将符号和数字分开处理。

由于反转,所以我们需要提取它每个数字,将这些数字按照位数依次乘回来并累加,最后加上符号即可。

当然,由于题目规定了范围,所以我们需要对溢出的数字进行控制。

代码如下:

class Solution:
    def reverse(self, x: int) -> int:
        '''
        时间复杂度O(n)
        '''
        if x == 0:  #排除特殊情况
            return 0

        str_x = str(x)   #将x转为字符串处理
        x = ''
        if str_x[0] == '-':
            x += '-'
        x += str_x[len(str_x)-1::-1].lstrip("0").rstrip("-")   #这个切片是python特有,从后往前开始计算。同时对此字符串进行处理,去掉左边的0和右边的负号
        x = int(x)       #转回到数字
        if -2**31<x<2**31-1:
            return x
        return 0


posted on 2020-06-28 00:35  eryoung2  阅读(88)  评论(0编辑  收藏  举报