LeetCode【仅仅反转字母】

题目描述:

给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发
生反转。

测试用例:

输入:"ab-cd"
输出:"dc-ba"
输入:"a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"

思路1(利用栈):

- 判断所给字符串是不是null,如果是null就直接返回nul;
-将S转为字符数组遍历,如果是字符就入栈;
-创建StringBuilder用来拼接反转后的字符;
 - 将S转为字符数组遍历,如果是字符,就将它出栈并且用StringBuilder拼接,
 否则直接用StringBuilder拼接;

代码如下:

import java.util.Stack;

class Solution {
    public String reverseOnlyLetters(String S) {
       if (S == null){
           return null;
       }
       Stack<Character> stack = new Stack<>();
       for (char ch : S.toCharArray()){
           if (Character.isLetter(ch)){
               stack.push(ch);
           }
       }
       StringBuilder stringBuilder = new StringBuilder();
       for (char ch : S.toCharArray()){
           if (Character.isLetter(ch)){
               stringBuilder.append(stack.pop());
           }else {
               stringBuilder.append(ch);
           }
       }
       return stringBuilder.toString();
    }
}

思路2(利用双指针):

 - 创建一个StringBuilder负责拼接反转后的字符串;
 - 定义一个left从S的0号位置向右遍历,定义一个right从右往左遍历;

代码如下:

class Solution {
    public static  String reverseOnlyLetters(String S) {
        StringBuilder stringBuilder = new StringBuilder();
        int right = S.length()-1;
        for (int left = 0; left < S.length(); left++) {
            if (Character.isLetter(S.charAt(left))){
                while(!Character.isLetter(S.charAt(right))){
                    right--;
                }
                stringBuilder.append(S.charAt(right--));
            }else {
                stringBuilder.append(S.charAt(left));
            }
        }
        return stringBuilder.toString();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值