LeetCode每日一题题解:917. 仅仅反转字母-双指针-python和C++

42 篇文章 1 订阅

大家经常在评论区问我如果学习Python,如何锻炼 自己的Python编程能力,这里给大家推荐一个我经常练习Python的网站:牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网

 里面还包含很多大厂笔试的Python题目,大家可以跟我一起刷题,从本周起我会陆续在博客分享我的刷题心得,欢迎大家跟我一起学习,有问题可以在评论区指出来,大家一起讨论。

917. 仅仅反转字母

难度简单112收藏分享切换为英文接收动态反馈

给你一个字符串 s ,根据下述规则反转字符串:

  • 所有非英文字母保留在原有位置。
  • 所有英文字母(小写或大写)位置反转。

返回反转后的 s 。

示例 1:

输入:s = "ab-cd"
输出:"dc-ba"

示例 2:

输入:s = "a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"

示例 3:

输入:s = "Test1ng-Leet=code-Q!"
输出:"Qedo1ct-eeLg=ntse-T!"

提示

  • 1 <= s.length <= 100
  • s 仅由 ASCII 值在范围 [33, 122] 的字符组成
  • s 不含 '\"' 或 '\\'

解题思路:

双指针,左右一起开始,如果都是字母直接相互换位置,否则继续左指针右移,右指针左移
python的.isalpha()函数用来判断改字符是不是字母,是字符返回True,否则返回False

下面附上python和C++的代码

python代码:

class Solution:
    def reverseOnlyLetters(self, s: str) -> str:
        ans = list(s)# 将字符串转换为列表便于操作
        l , r = 0 , len(s)-1   #双指针
        while l < len(s) - 1:  #开始遍历字符串
            while l < r and not s[l].isalpha():  #如果不是字母,则左指针向右移
                    l += 1                       
            while l < r and not s[r].isalpha():  #如果不是字符,则右指针向左移
                    r -= 1
            if l >= r:     #如果左指针大于等于右指针,则跳出循环
                break
            ans[l] , ans[r] = ans[r] , ans[l]  #左右指针的值交换
            l += 1  #左指针加一
            r -= 1   #有指针减一
        return ''.join(ans)  #将列表转换为字符串输出结果
            

C++代码: 

class Solution {
public:
    string reverseOnlyLetters(string s) {
        int n = s.size(); //求出s数组的长度
        int l = 0 , r = n-1;   // 定义双指针
        while (l < (n-1)) {   //开始构造循环
            while (l < r && !isalpha(s[l])) {  
                l++;
            }
            while (l < r && !isalpha(s[r])) {
                r--;
            }
            if (l >= r) {
               break;
            }
            swap(s[l] , s[r]);  //swap C++的交换函数
            l++; 
            r--;
        }
        return s;
    }
};




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小馨馨的小翟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值