算法通关村之字符串(实战训练)经典问题:转换小写字母、字符串反转、K个一组反转、仅反转字母

基础知识(青铜挑战)

转换成小写字母
  • 遍历该字符串,依次转换为小写,存入新的字符串中

具体代码如下:
java 复制代码
  public static String toLowerCase(String s) {
        int n = s.length();
        char[] chars = s.toCharArray();
        for (int i = 0; i < n; ++i) {
            if (chars[i] >= 65 && chars[i] <= 90) {
                chars[i] += 32;
            }
        }
        String str = new String(chars);
        return str;
    }

实战训练(白银挑战)

反转字符串
  • 思路:

    • 使用双指针,一个在前,一个在后,相向移动,遍历字符串

    • 在遍历的过程中,将两指针指向的元素交换位置

    • 直到两指针相遇

具体代码如下:(2023/09/30早)
java 复制代码
 public static void reverseString(char[] s) {
        int n = s.length;
        for (int left = 0, right = n - 1; left < right; ++left, --right) {
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
        }
    }
K个一组反转
仅反转字母
  • 我们有两种思路:

    • 将所有的字母压栈

    • 双指针遍历字符串

压栈法:
  • 遍整个字符串,将字母依次压入栈中

  • 创建一个新的字符串对象,再次遍历该字符串:如果是非字母,将该字符放入新字符串;如果是字母,则从存入弹出的栈顶元素

  • 直到遍历结束

具体代码如下:
java 复制代码
public static String reverseOnlyLetters(String S) {
        Stack<Character> letters = new Stack();
        for (char c : S.toCharArray())
            if (Character.isLetter(c))
                letters.push(c);
​
        StringBuilder ans = new StringBuilder();
        for (char c : S.toCharArray()) {
            if (Character.isLetter(c))
                ans.append(letters.pop());
            else
                ans.append(c);
        }
​
        return ans.toString();
    }
双指针法:
  • 定义两个指针,一个从头向后遍历,一个从后向前,维护字母字符

  • 创建一个新的字符串对象,前指针遍历字符串

  • 如果是非字母,则将该字符放入新字符串;如果是字母,则移动后指针,找到字母,将该字母存入新的字符串

  • 直到前指针遍历结束

具体代码如下:
java 复制代码
public static String reverseOnlyLetters2(String S) {
        if (S == null || S.length() == 0){
            return  S;
        }
​
        StringBuffer ans = new StringBuffer();
        int j =  S.length() - 1;
        for (int i = 0; i < S.length(); i++) {
            if(Character.isLetter(S.charAt(i))){
                while (!Character.isLetter(S.charAt(j)))
                    j--;
                ans.append(S.charAt(j--));
            }else {
                ans.append(S.charAt(i));
            }
        }
        return ans.toString();
    }
相关推荐
数智工坊14 分钟前
【UniT论文阅读】:用统一物理语言打通人类与人形机器人的知识壁垒
论文阅读·人工智能·深度学习·算法·机器人
梓䈑16 分钟前
【算法题攻略】模拟
c++·算法
BIG_PEI16 分钟前
检查并安装Redis
java
大貔貅喝啤酒18 分钟前
基于Windows下载安装Android Studio 3.3.2版本教程(2026详细图文版)
android·java·windows·android studio
Evand J18 分钟前
【课题推荐与代码介绍】卡尔曼滤波器正反向估计算法原理与MATLAB实现
开发语言·算法·matlab
奋斗的小方20 分钟前
Java基础篇09:项目实战
java·开发语言
海兰21 分钟前
【第21篇-续】graph-Stream-Node改造为适配openAI模型示例
java·人工智能·spring boot·spring·spring ai
DFT计算杂谈22 分钟前
VASP新手入门: IVDW 色散修正参数
linux·运维·服务器·python·算法
vKd0Ff21L23 分钟前
如何在Dev-C++中设置TDM-GCC为默认编译器第九十一篇
java·jvm·c++
武子康25 分钟前
Java-221 RocketMQ 消息存储核心原理:CommitLog、ConsumerQueue、IndexFile 与消息过滤机制
java·大数据·分布式·消息队列·rabbitmq·rocketmq·java-rocketmq