代码随想录算法训练营第8天 | 字符串,344.反转字符串,541. 反转字符串II,LCR 122. 路径加密,151.翻转字符串里的单词,LCR 182. 动态口令

344.反转字符串

题目链接:LeetCode
文章讲解:代码随想录
视频讲解:哔哩哔哩
编写语言:Java
完成状态:已完成

解题思路

  • 定义两个指针从两边向中间交换

代码

  1. 双指针解法
class Solution {
    public void reverseString(char[] s) {
        // 使用双指针法,将数组中的字符进行反转
        for (int i = 0, j = s.length - 1; i < j; i++, j--) {
            char temp = s[i]; // 临时变量用于存储 s[i] 的值
            s[i] = s[j]; // 将 s[j] 的值赋给 s[i]
            s[j] = temp; // 将之前保存的 s[i] 值赋给 s[j]
        }
    }
}


541. 反转字符串II

题目链接:LeetCode
文章讲解:代码随想录
视频讲解:哔哩哔哩
编写语言:Java
完成状态:已完成

解题思路

  • 判断好i每次加2k个值,讨论剩下字符是否大于k个的情况,分别反转

代码

  1. 分别判断
class Solution {
    public String reverseStr(String s, int k) {
        // 按照题目要求,每隔2k个字符进行反转操作
        for (int i = 0; i < s.length(); i += 2 * k) {
            if (i + k < s.length()) {
                // 如果当前片段的长度大于k,则将该片段的前k个字符进行反转
                s = reverse(s, i, i + k - 1);
            } else {
                // 否则将整个片段进行反转
                s = reverse(s, i, s.length() - 1);
            }
        }
        return s;
    }

    public String reverse(String s, int start, int end) {
        // 将字符串转换为字符数组
        char[] ch = s.toCharArray();
        // 使用双指针方式进行反转操作
        for (int i = start, j = end; i <= j; i++, j--) {
            // 交换指针所指向的字符
            char temp = ch[j];
            ch[j] = ch[i];
            ch[i] = temp;
        }
        // 将字符数组转换为字符串并返回
        return new String(ch);
    }
}

LCR 122. 路径加密

题目链接:LeetCode
文章讲解:代码随想录
编写语言:Java
完成状态:已完成

解题思路

  • 可以用替换的内置方法或者遍历重新拼接字符串

代码

  1. 内置库函数
class Solution {
    public String pathEncryption(String path) {
        // 将传入的字符串中的"."替换为" "
        String nS = path.replace(".", " ");
        return nS;
    }
}
  1. 重新拼接
class Solution {
    public String pathEncryption(String path) {
        // 创建一个 StringBuilder 对象,用于存储加密后的路径
        StringBuilder sb = new StringBuilder();
        
        // 遍历路径中的每个字符
        for (char c : path.toCharArray()) {
            // 如果字符是 '.',则将其替换为一个空格,并追加到加密后的路径中
            if (c == '.') {
                sb.append(" ");
            } else {
                // 如果字符不是 '.',则直接追加到加密后的路径中
                sb.append(c);
            }
        }
        
        // 将 StringBuilder 对象转换为字符串并返回
        return sb.toString();
    }
}

151.翻转字符串里的单词

题目链接:LeetCode
文章讲解:代码随想录
视频讲解:哔哩哔哩
编写语言:Java
完成状态:已完成

解题思路

  1. 去掉多余空格
  2. 将代码全部反转
  3. 以空格为界,分割成各个单词,再分别反转每个单词
  4. 进行单词拼接

代码

  1. 反转拼接
class Solution {
    public String reverseWords(String s) { // " the  sky is blue "
        // 去除字符串两端的空格, "the  sky is blue"
        String trim1 = s.trim(); 
        // 将字符串反转, " eulb si yks  eht"
        StringBuilder sb_reverse = new StringBuilder(trim1).reverse();
        // 将反转后的字符串按空格分割成单词数组, ["eulb si yks eht"]
        String[] str_words = sb_reverse.toString().split("\\s+");
        // 用于保存最终结果的变量
        String result = "";
        // 遍历单词数组
        for (String str : str_words) {
            // 反转当前单词,并添加到结果中, ["blue is sky the"]
            result += new StringBuilder(str).reverse().toString();
            // 在每个单词后面添加一个空格
            result += " ";
        }  
        // 去除结果字符串末尾的空格并返回
        return result.trim();
    }
}

LCR 182. 动态口令

题目链接:LeetCode
文章讲解:代码随想录
编写语言:Java
完成状态:已完成

解题思路

  • 先保存前target个字符,在删除,最后将字符拼接到末尾即可

代码

  1. 拼接
class Solution {
    /**
     * 动态密码生成方法
     * @param password 原始密码
     * @param target 目标字符数
     * @return 生成的动态密码
     */
    public String dynamicPassword(String password, int target) {
        StringBuilder str = new StringBuilder(); // 创建一个可变字符串,用于存储目标字符之前的字符
        char[] ch = password.toCharArray(); // 将原始密码转换为字符数组
        for (int i = 0; i < target; i++) { // 循环遍历原始密码的前target个字符
            str.append(ch[i]); // 将每个字符添加到可变字符串中
        }
        StringBuilder str_result = new StringBuilder(password).delete(0, target); // 创建一个新的可变字符串,删除原始密码的前target个字符
        return str_result.append(str).toString(); // 将目标字符追加在删除后的字符串后面,并将结果转换为字符串返回
    }
}

你可能感兴趣的:(代码随想录算法训练营24期,算法,java,leetcode,数据结构)