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


    基础知识(青铜挑战)

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

    • 具体代码如下:
    1.  public static String toLowerCase(String s) {
    2.        int n = s.length();
    3.        char[] chars = s.toCharArray();
    4.        for (int i = 0; i < n; ++i) {
    5.            if (chars[i] >= 65 && chars[i] <= 90) {
    6.                chars[i] += 32;
    7.           }
    8.       }
    9.        String str = new String(chars);
    10.        return str;
    11.   }

    实战训练(白银挑战)

    反转字符串
    • 思路:

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

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

      • 直到两指针相遇

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

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

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

      • 直到遍历结束

    • 具体代码如下:
    1. public static String reverseOnlyLetters(String S) {
    2.        Stack letters = new Stack();
    3.        for (char c : S.toCharArray())
    4.            if (Character.isLetter(c))
    5.                letters.push(c);
    6.        StringBuilder ans = new StringBuilder();
    7.        for (char c : S.toCharArray()) {
    8.            if (Character.isLetter(c))
    9.                ans.append(letters.pop());
    10.            else
    11.                ans.append(c);
    12.       }
    13.        return ans.toString();
    14.   }
    • 双指针法:
      • 定义两个指针,一个从头向后遍历,一个从后向前,维护字母字符

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

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

      • 直到前指针遍历结束

    • 具体代码如下:
    1. public static String reverseOnlyLetters2(String S) {
    2.        if (S == null || S.length() == 0){
    3.            return  S;
    4.       }
    5.        StringBuffer ans = new StringBuffer();
    6.        int j =  S.length() - 1;
    7.        for (int i = 0; i < S.length(); i++) {
    8.            if(Character.isLetter(S.charAt(i))){
    9.                while (!Character.isLetter(S.charAt(j)))
    10.                    j--;
    11.                ans.append(S.charAt(j--));
    12.           }else {
    13.                ans.append(S.charAt(i));
    14.           }
    15.       }
    16.        return ans.toString();
    17.   }
  • 相关阅读:
    数据结构(13)最小生成树JAVA版:prim算法、kruskal算法
    Linux内核网络设备驱动
    多模态相关论文笔记
    Electron入门知识
    [Mac软件]Goldie App v2.2 Mac黄金比例设计工具
    E047-论坛漏洞分析及利用-针对Wordpress论坛进行信息收集与漏洞扫描的探索
    3、Pinpoint-Agent端注册服务到Server端
    Zabbix监控入门到跑路
    【二叉树】树是什么?-树和二叉树的基本必会概念讲解
    OpenShift常用管理命令杂记
  • 原文地址:https://blog.csdn.net/m0_62570784/article/details/133460451