代码随想录算法训练营Day8|LeetCode

Q344

def reverseString(self, s: List[str]) -> None:
  ''' 
  Do not return anything, modify s in-place instead
  '''
  left, right = 0, len(s)-1
  while left < right:
    s[left], s[right] = s[right], s[left]
    left += 1
    right -= 1

Q541

def reverseStr(self, s: str, k: int) -> str:
  '''
  1. use range(start, end, step) to determine the intial position of reverse
  2. to s='abc', if use s[0:999]===>'abc'字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。
  3. 用切片整体替换,而不是一个个替换
  '''
  def reverse_substring(text):
    left, right = 0, len(text)-1
    while left < right:
      text[left], text[right] = text[right], text[left]
      left += 1
      right -= 1
    return text
  
  res = list(s)
  for cur in range(0, len(s), 2*k):
    res[cur: cur+k] = reverse_substring(res[cur: cur+k])
  return ''.join(res)

Switch Blank

def replaceSpace(self, s: str) -> str:
  counter = s.count(' ')
  res = list(s)
  res.extend([' ']*counter*2)# 每碰到一个空格就多拓展两个格子,1 + 2 = 3个位置存’%20‘
  left, right = len(s)-1, len(res)-1
  while left >= 0:
    if res[left] != ' ':
      res[right] = res[left]
      right -= 1
    else:
      res[right - 2: right + 1] = '%20'
      right -= 3
    left -= 1
  return ''.join(res)

Q151

class Solution:
  #1.去除多余的空格
        def trim_spaces(self, s):     
            n = len(s)
            left = 0
            right = n-1
        
            while left <= right and s[left] == ' ':#去除开头的空格
                left += 1
            while left <= right and s[right] == ' ': #去除结尾的空格
                right = right-1
            tmp = []
            while left <= right: #去除单词中间多余的空格
                if s[left] != ' ':
                    tmp.append(s[left])
                elif tmp[-1] != ' ':#当前位置是空格,但是相邻的上一个位置不是空格,则该空格是合理的
                    tmp.append(s[left])
                left += 1
            return tmp
        
 #2.翻转字符数组
        def reverse_string(self, nums, left, right):
            while left < right:
                nums[left], nums[right] = nums[right], nums[left]
                left += 1
                right -= 1
            return None
        
 #3.翻转每个单词
        def reverse_each_word(self, nums):
            start = 0
            end = 0
            n = len(nums)
            while start < n:
                while end < n and nums[end] != ' ':
                    end += 1
                self.reverse_string(nums, start, end-1)
                start = end + 1
                end += 1
            return None

#4.翻转字符串里的单词
        def reverseWords(self, s): 
#测试用例:"the sky is blue"
            l = self.trim_spaces(s)
#输出:['t', 'h', 'e', ' ', 's', 'k', 'y', ' ', 'i', 's', ' ', 'b', 'l', 'u', 'e'
            self.reverse_string(l,  0, len(l)-1) 
#输出:['e', 'u', 'l', 'b', ' ', 's', 'i', ' ', 'y', 'k', 's', ' ', 'e', 'h', 't']
            self.reverse_each_word(l)             
#输出:['b', 'l', 'u', 'e', ' ', 'i', 's', ' ', 's', 'k', 'y', ' ', 't', 'h', 'e']
            return ''.join(l)                   
#输出:blue is sky the

Reference from: https://programmercarl.com/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二十二天的算法训练主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小的子数组,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值