双指针应用一:碰撞指针

摘要:
交换指针对应的元素,然后同时将指针移动到中间,直到指针碰撞。函数应返回两个下标值index1和index2,其中index1必须小于index2。算法思路:定义左指针l=0,右指针r=len-1。给定一个字符串,验证它是否是回文字符串。只考虑字母和数字字符,可以忽略字母的大小写。1如果参考元素是字母或数字;判断左右指针是否指向相同的元素。在坐标系中绘制n条垂直线。垂直线i的两个端点分别为和(i,0)。找出这两条线,这样由它们和x轴组成的容器可以容纳最多的水。

1、翻转数组中的元素:s = ['l', 'e', 'e', 't', 'c', 'o', 'd', 'e']

算法思路:定义左指针 i=0, 右指针 r = len(s)-1。交换指针对应的元素,然后同时向中间移动指针,直到指针碰撞。在指针移动的同时,交换指针指代的元素。

def reverseStr(s):
    l=0
    r=len(s)-1
    while l<r:
        s[l],s[r]=s[r],s[l]
        l+=1
        r-=1
    return s

s = ['l', 'e', 'e', 't', 'c', 'o', 'd', 'e']
print(reverseStr(s))

2、两数之和:给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

      示列:输入:numbers = [2, 7, 11, 15], target = 9   输出:[1 2].  解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。

     算法思路:定义左指针 l=0, 右指针 r=len(nums)-1 。计算两个指针指代的元素之和:sum=nums[l]+nums[r]。如果sum<target,向中间移动左指针;如果sum>target,

   右指针向左边移动。直到sum==target,返回 [l+1,r+1]。

def twoSum(nums,target):
    l=0
    r=len(nums)-1
    while l<r:
        sum=nums[l]+nums[r]
        if sum>target:
            r-=1
        elif sum<target:
            l+=1
        else:
            return (l+1,r+1)
            
        
nums=[2, 7, 11, 15]
target=9
print(twoSum(nums,target))

 3、验证回文字符串。给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

  输入: "A man, a plan, a canal: Panama" 输出: true
算法思路:初始化左指针 l=0,右指针 r=len(s)-1.判断左右指针指代的元素是否为字母或数字。如果不是,左、右指针向中间移动。1如果指代元素为字母或数字;
判断左、右指针指代元素是否相等。如果不等,返回False。如果相等,左右指针向中间移动,判断下一个元素是否相等。
def isPalindrome(s):
    n=len(s)
    l=0
    r=n-1
    while l<r:
        if s[l].isalnum()==False:
            l+=1
            continue
        if s[r].isalnum()==False:
            r-=1
            continue
        if s[l].lower()!=s[r].lower():
            return False
        l+=1
        r-=1
    return True

s="A man, a plan, a canal: Panama"
print(isPalindrome(s))

4、翻转字符串元音字母。输入: "hello"  输出: "holle"。算法思路类似于题3.

def reverseVowels(s):
    s=list(s)
    res = ['a', 'e', 'i', 'o', 'u', 'A','E','I','O','U']
    l=0
    r=len(s)-1
    while l<r:
        if s[l] not in res:
            l+=1
            continue
        if s[r] not in res:
            r-=1
            continue
        if (l<r):
            s[l],s[r]=s[r],s[l]
        l+=1
        r-=1
    return "".join(s)


s="hello"
print(reverseVowels(s))

5、 盛最多水的容器。给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (iai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (iai) 和 (i, 0)。找出其中的两条           线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

def maxArea(height):
    l=0
    r=len(height)-1
    #初始化面积
    area=0
    while l<r:
        if height[l]<=height[r]:
            area=max(area,(r-l)*height[l])
            l+=1
        if height[l]>height[r]:
            area=max(area,(r-l)*height[r])
            r-=1
    return area


height=[1,8,6,2,5,4,8,3,7]
print(maxArea(height))

      

免责声明:文章转载自《双指针应用一:碰撞指针》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Confluence 6 设置其他页面为你空间的主页maven 命令小记下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Systemd简介与使用

按下电源键,随着风扇转动的声音,显示器上开启的图标亮起。之后,只需要静静等待几秒钟,登录界面显示,输入密码,即可愉快的玩耍了。 这是我们大概每天都做的事情。那么中间到底发生了什么? 简单地说,从BIOS或者UEFI开始读取硬盘。接下来,进入bootloader(LILO或者GRUB),bootloader开始载入内核,内核初始化完毕后,紧接着进入用户空间的...

IPTABLES详解(10):IPTABLES自定义链

前提基础: 当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。 iptables实现防火墙功能的原理是:在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数,...

快速编译system.img和boot.img的方法

快速编译system.img,可以使用这个命令: #make systemimage  快速编译boot.img,可以使用以下命令: #make bootimage  快速编译userdata.img,可以使用以下命令: # make userdataimage-nodeps 但是,对于bootimage, 在不改变内存布局的情况下,可以使用以下命令: #...

读《C陷阱与缺陷》

《C陷阱与缺陷》里面介绍了一些自己不知道和以前理解不深的东东,现总结如下: 1.词法分析的陷阱(本书第9页) y = x/*p; /* p指向除数 */ 上述语句的本意是:用x除以指针p所指向的值,然后把商赋给y;但是/*被编译器理解为一段注释的开始,编译器将不断地读入字符,直到*/出现为止。也就是说该语句实际的执行效果只是将x的值赋...

《C++ Qt设计模式》 第一章 C++ 简介

第1 章 C++简介 内容: 编译相关     Qt提供了一个qmake工具,它会产生Makefile 文件。使用qmake -project 命令产生一个简单的工程文件。当执行这个命令时,qmake 会将当前工作目录下的全部源文件作为SOURCES列出来,而将全部头文件作为HEADERS 列出来     使用make 重新编译那些发生了变化的文件,或...

Systemd自定义开机启动服务(转载)

一、开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件。 如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例)。 $ sudo systemctl enable httpd 上面的命令相当于在/etc/systemd/system目录添加一个符号链...