• 双指针应用--快慢指针


    1、给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

        算法思路:准备重置数组nums[0.....l]

    def removeElement(nums,val):
    #想象一个新数组nums[0....l],其索引从0...l。 l
    =0 #遍历现数组,找出不等于val的数,然后赋值给新数组。 for r in range(len(nums)): if nums[r]!=val: #赋值. nums[l]=nums[r] l+=1 return l nums = [0,1,2,2,3,0,4,2] val=2 print(removeElement(nums,val))

    2、给定一个二进制数组, 计算其中最大连续1的个数。 输入: [1,1,0,1,1,1]  输出: 3。

        算法思路:初始化count=0用于记录1的个数,初始化res=0用来记录连续1的个数。指针 i 用于遍历数组,遇到1,count自增。遇到 0,count归零。res=max(res,count)。

    def findMaxConsecutiveOnes(nums):
        if 1 not in nums:
            return 0
        else:
            n=len(nums)
            count=0
            res=0
            for i in range(len(nums)):
                if nums[i]!=0:
                    count+=1
                    res=max(res,count)
                if nums[i]==0:
                    count=0
            return res
    
    
    nums=[1,1,0,1,1,1]
    print(findMaxConsecutiveOnes(nums))

    3、给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

    输入: "Let's take LeetCode contest" 输出: "s'teL ekat edoCteeL tsetnoc"
    算法思路:将字符串转换成列表。想象一个新的列表,索引 0....j。遍历现列表,翻转其中的元素,然后赋值给新列表。
    def reverseWords(s):
        s=s.split()
        n=len(s)
        j=0
        for i in range(n):
            s[j]=s[i][::-1]
            j+=1
        return " ".join(s)
        
    s="Let's take LeetCode contest"
    print(reverseWords(s))

    4、给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

    给定数组 nums = [1,1,2]  函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2.
    算法思路:
    初始化慢指针 j=0.快指针 i 用于遍历。当指针 i,j 指代的元素不等时,指针j+=1.然后赋值:nums[j]=nums[i]。完成对数组nums的修改。
    def f(nums):
        n=len(nums)
        j=0
        for i in range(n):
            if nums[j]!=nums[i]:
                j+=1
                nums[j]=nums[i]
        return j+1
    
    nums = [0,0,1,1,1,2,2,3,3,4]
    print(f(nums))

    5、给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。给定 nums = [1,1,1,2,2,3], 函数应返回新长度 length = 5,

          并且原数组的前五个元素被修改为 1, 1, 2, 2, 3算法思路:j指针指向数组元素的位置,i指针遍历现数组。然后把复合要求的i所指代的值赋给j,

           完成对数组nums的修改。因为每个元素可以出现2次,那么只需要从数组nums第二个数开始 修改即可,即 j 的初始值为 1.

    def f(nums):
        j=1
        count=1
        n=len(nums)
        for i in range(1,n):
            if nums[i]==nums[i-1]:
                count+=1
            else:
                count=1
            if count<=2:
                nums[j]=nums[i]
                j+=1
        return j
    nums = [1,1,1,2,2,3]
    print(f(nums))

     6、给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

        输入: [0,1,0,3,12]  输出: [1,3,12,0,0]

         算法思路:设置慢指针 j用来指代非零元素且设定初始值 j=0。快指针 i 用来遍历数组,找出非零元素、然后赋值给 j 所指代的元素。即 nums【j】=nums[i]

         完成一次赋值后,慢指针 j 移动到下一个元素,即 j+=1.然后再次赋值。当 i 针遍历结束后,前 j 个元素军重置为该数组的非零元素。接下来只需把后续的元素归零即可。

    def moveZeroes(nums):
        n=len(nums)
        j=0
        for i in range(n):
            if nums[i]!=0:
                nums[j]=nums[i]
                j+=1
        for k in range(j,n):
            nums[k]=0
        return nums
    
    
    nums=[0,1,0,3,12]
    print(moveZeroes(nums))



    
    
     


  • 相关阅读:
    JSPatch 可以让你用 JavaScript 书写原生 iOS APP
    iOS如何解析crash文件中的地址
    这几个Xocode插件用过一段时间还比较稳定好用,Xcode6兼容,推荐给大家:
    你的下拉刷新是否“抖”了一下
    iOS上Delegate的悬垂指针问题
    UITableView性能优化
    block详解
    runloop timer
    图片知识总结
    视像会议软件推荐备忘
  • 原文地址:https://www.cnblogs.com/yijierui/p/13288637.html
Copyright © 2020-2023  润新知