• 力扣 2020.06.27


    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
    


  • 相关阅读:
    docker的基本操作
    docker和虚拟化技术的区别
    项目命名规则
    Javascript IE 内存释放
    关于ie的内存泄漏与javascript内存释放
    Java遍历HashMap并修改(remove)
    java 中类的加载顺序
    java类的加载以及初始化顺序 .
    JavaScript也谈内存优化
    JavaScript 的垃圾回收与内存泄露
  • 原文地址:https://www.cnblogs.com/young233/p/13200706.html
Copyright © 2020-2023  润新知