当前位置: 首页 > news >正文

【JS】反转字符串中的单词

题目

思路

  • 先去除多余空格,使用快慢指针法,参考双指针法(快慢指针)解决元素移除问题
  • 再反转整个字符串,参考【JS】反转字符串题目怎么写
  • 使用循环再分别把每段字符反转回来

示例代码

/**
 * @param {string} s - 输入的字符串
 * @return {string} - 翻转单词后的字符串
 */
var reverseWords = function(s) {
    // 将输入的字符串转换为字符数组
    const strArr = Array.from(s);
    // 调用函数移除字符数组中多余的空格,包括开头、中间连续的空格以及末尾的空格
    removeExtraSpaces(strArr);
    // 调用函数对整个字符数组进行翻转操作,即将整个字符串的字符顺序颠倒
    reverse(strArr, 0, strArr.length - 1);

    let start = 0;

    // 遍历字符数组,用于定位每个单词的起始和结束位置并进行单词翻转
    for(let i = 0; i <= strArr.length; i++) {
        // 当遇到空格或者到达字符数组的末尾时,表示一个单词结束
        if (strArr[i] === ' ' || i === strArr.length) {
            // 调用函数对当前单词(从start到i - 1位置的字符)进行翻转
            reverse(strArr, start, i - 1);
            // 更新下一个单词的起始位置为当前空格的下一个位置
            start = i + 1;
        }
    }

    // 将处理后的字符数组重新拼接成字符串并返回
    return strArr.join('');
};

// 定义函数用于删除字符数组中多余的空格
function removeExtraSpaces(strArr) {
    let slowIndex = 0;
    let fastIndex = 0;

    // 遍历字符数组,fastIndex用于快速移动,slowIndex用于记录有效字符的位置
    while(fastIndex < strArr.length) {
        // 如果当前字符是空格,并且是字符串开头的空格或者前一个字符也是空格,
        // 则说明是多余的空格,直接跳过,fastIndex向后移动一位
        if (strArr[fastIndex] === ' ' && (fastIndex === 0 || strArr[fastIndex - 1] === ' ')) {
            fastIndex++;
        } else {
            // 如果当前字符不是多余的空格,则将其赋值到slowIndex位置,
            // 然后slowIndex和fastIndex都向后移动一位
            strArr[slowIndex++] = strArr[fastIndex++];
        }
    }

    // 如果最后一个字符是空格,说明末尾有多余的空格,需要去除
    //因为每次将有效字符赋值给 strArr[slowIndex] 后,slowIndex 都会自增 1,所以 slowIndex - 1 就是最后一个有效字符的位置
    // 通过判断slowIndex - 1位置的字符是否为空格来决定是否更新字符数组的长度
    strArr.length = strArr[slowIndex - 1] === ' '? slowIndex - 1 : slowIndex;
}

// 定义函数用于翻转字符数组中指定区间内的字符
function reverse(strArr, start, end) {
    let left = start;
    let right = end;
    while (left < right) {
        [strArr[left], strArr[right]] = [strArr[right], strArr[left]];
        left++;
        right--;
    }
}

欢迎指正!

相关文章:

  • 计算机网络基础:WiFi 与蓝牙的原理与应用
  • JavaScript中的继承有哪些方式?各有什么优缺点
  • 强化学习与神经网络结合(以 DQN 展开)
  • STL之空间配置器
  • 【深度学习与实战】2.1、线性回归模型与梯度下降法先导
  • 数据结构:利用递推式计算next表
  • PostgreSQL详解
  • SiLU与GeLU激活函数:现代大模型的选择
  • WindowsPowerShell、CMD Linux Bash对比分析
  • 工作中遇到的spark SQL小问题:包含某个或某些字符的条件
  • uniapp + Axios + 小程序封装网络请求
  • 力扣HOT100之子串:76. 最小覆盖子串
  • mock.js模拟数据
  • 在linux部署网站
  • Rust vs. Go: 在仅使用标准库时的性能测试
  • 数据库基础知识点(系列七)
  • element-plus 的简单应用
  • Python----计算机视觉处理(Opencv:图像边缘检测:非极大值抑制,双阈值筛选)
  • Vue基本使用
  • qt+opengl 加载三维obj文件
  • 涉个人信息收集使用问题,15款App和16款SDK被通报
  • 创历史同期新高!“五一”假期全国快递揽投超48亿件
  • 胖东来关闭官网内容清空?工作人员:后台维护升级
  • 9金收官!跳水世界杯总决赛朱子锋、程子龙包揽男子10米台冠亚军
  • “特朗普效应”下澳大利亚执政工党赢得大选,年轻选民担忧房价
  • 猎金,游戏,诚不我欺