代码随想录算法训练营第八天 | 字符串

简介: 代码随想录算法训练营第八天 | 字符串

前言

今天开始算法进入字符串专项练习,今日任务:

344. 反转字符串

题目描述

网络异常,图片无法展示
|

思路分析

这个类似于双指针, 两个元素交换

代码展示

public static void reverseString(char[] s) {
    for (int i = 0; i < s.length / 2; i++) {
        char temp = s[i];
        s[i] = s[s.length - i  - 1];
        s[s.length - i  - 1] = temp;
    }
}
复制代码

提交记录

网络异常,图片无法展示
|

541. 反转字符串 II

题目描述

网络异常,图片无法展示
|

思路分析

先对每 2k个数按照要求进行反转, 然后在判断最后几个数要反转的下标, 按要求进行反转

代码展示

public static String reverseStr(String s, int k) {
    char[] chars = s.toCharArray();
    int left = 0, right = 2 * k;
    while(right < s.length()){
        int m = left + k - 1;
        while(left < m){
            char temp = chars[left];
            chars[left++] = chars[m];
            chars[m--] = temp;
        }
        left = right;
        right += 2*k;
    }
    right =  s.length() - left < k ? s.length() - 1: left + k - 1;
    while(left < right){
        char temp = chars[left];
        chars[left++] = chars[right];
        chars[right--] = temp;
    }
    return String.valueOf(chars);
}
复制代码

提交结果

网络异常,图片无法展示
|

剑指 Offer 05. 替换空格

题目描述

网络异常,图片无法展示
|

思路分析

  • 遍历字符串
  • 每个字符串是否为 空格
  • 如果为空格则替换为 %20
  • 使用 StringBuilder,因为要进行多次的字符串修改操作

代码展示

public static String replaceSpace(String s) {
    char[] chars = s.toCharArray();
    StringBuilder str = new StringBuilder();
    for (char aChar : chars) {
        if(aChar == ' '){
            str.append("%20");
        }else{
            str.append(aChar);
        }
    }
    return str.toString();
}
复制代码

提交结果

网络异常,图片无法展示
|

151. 反转字符串中的单词

题目描述

网络异常,图片无法展示
|

思路分析

简单来说就是遍历字符串保存每一个单词,然后倒序输出就可以了

注意事项:

  • 字符串以空格开头
  • 字符串以空格结尾
  • 每两个单词中间存在多个空格

代码展示

public static String reverseWords(String s) {
    StringBuilder str = new StringBuilder();
    char[] chars = s.toCharArray();
    Stack<String> stack = new Stack<>();
    for (char aChar : chars) {
        if (aChar == ' '){
            if (!str.toString().equals("")){
                stack.push(str.toString());
                str = new StringBuilder();
            }
        }else{
            str.append(aChar);
        }
    }
    if (!"".equals(str.toString())){
        stack.push(str.toString());
    }
    str = new StringBuilder();
    while(!stack.isEmpty()){
        str.append(stack.pop());
        str.append(' ');
    }
    return str.deleteCharAt(str.length() - 1).toString();
}
复制代码

提交记录

网络异常,图片无法展示
|

总结

可以看到,这道题每一次都会出现错误,每一次都是在细节的问题上,希望有一天做题能够考虑的更加周到

剑指 Offer 58 - II. 左旋转字符串

题目描述

网络异常,图片无法展示
|

思路分析

还是遍历字符串,根据 n来当做分界值,先遍历 >=n的值,在遍历 <n的值

【代码展示】中分别是上次提交和本次提交的代码, 咱也不知道为啥上次写的那么麻烦, 但是确实是执行用时会少一点,毕竟是在同一个字符串内进行操作,但是代码量会多很多,内存消耗差不多

代码展示

上次代码

public String reverseLeftWords(String s, int n) {
    char[] chars = s.toCharArray();
    int length = chars.length;
    int t = n;
    for (int i = 0; i <  n; i++) {
        n--;
        char temp = chars[i];
        chars[i] = chars[n];
        chars[n] = temp;
    }
    for (int i = t; i < length; i++) {
        char temp = chars[i];
        chars[i] = chars[length - 1];
        chars[length - 1] = temp;
        length--;
    }
    length = chars.length;
    for (int i = 0; i < length; i++) {
        char temp = chars[i];
        chars[i] = chars[length - 1];
        chars[length - 1] = temp;
        length--;
    }
    return String.valueOf(chars);
}
复制代码

本次代码

public static String reverseLeftWords(String s, int n) {
    char[] chars = s.toCharArray();
    StringBuilder str = new StringBuilder();
    for (int i = n; i < chars.length; i++) {
        str.append(chars[i]);
    }
    for (int i = 0; i < n; i++) {
        str.append(chars[i]);
    }
    return str.toString();
}
复制代码

提交结果

网络异常,图片无法展示
|

总结

字符串专项练习截止到目前依旧是拿捏,根据目前的练习,字符串方面主要还是以遍历为主,依托于遍历来进行的各种其他操作


目录
相关文章
|
1月前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
65 1
|
2月前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
2月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
12天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
145 80
|
5天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
8天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
4天前
|
算法
基于梯度流的扩散映射卡尔曼滤波算法的信号预处理matlab仿真
本项目基于梯度流的扩散映射卡尔曼滤波算法(GFDMKF),用于信号预处理的MATLAB仿真。通过设置不同噪声大小,测试滤波效果。核心代码实现数据加载、含噪信号生成、扩散映射构建及DMK滤波器应用,并展示含噪与无噪信号及滤波结果的对比图。GFDMKF结合非线性流形学习与经典卡尔曼滤波,提高对非线性高维信号的滤波和跟踪性能。 **主要步骤:** 1. 加载数据并生成含噪测量值。 2. 使用扩散映射捕捉低维流形结构。 3. 应用DMK滤波器进行状态估计。 4. 绘制不同SNR下的轨迹示例。
|
9天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。
|
3天前
|
算法 5G
基于MSWA相继加权平均的交通流量分配算法matlab仿真
本项目基于MSWA(Modified Successive Weighted Averaging)相继加权平均算法,对包含6个节点、11个路段和9个OD对的交通网络进行流量分配仿真。通过MATLAB2022A实现,核心代码展示了迭代过程及路径收敛曲线。MSWA算法在经典的SUE模型基础上改进,引入动态权重策略,提高分配结果的稳定性和收敛效率。该项目旨在预测和分析城市路网中的交通流量分布,达到用户均衡状态,确保没有出行者能通过改变路径减少个人旅行成本。仿真结果显示了27条无折返有效路径的流量分配情况。

热门文章

最新文章