代码随想录算法训练营第八天 344.反转字符串 541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串

344.反转字符串

题目链接:. - 力扣(LeetCode)

这道题的思路就是用双指针法,从字符串两边不断移动左右两个指针,并进行交换;

var reverseString = function (s) {
    let left = 0,
        right = s.length - 1;
    while (left < right) {
        [s[left], s[right]] = [s[right], s[left]];
        left = left + 1;
        right = right - 1;
    }
    return s;
};

 541. 反转字符串II

题目链接: . - 力扣(LeetCode)

和上面的题思路类似,也是用双指针,区别是要注意边界条件

 // js中字符串是不可变的,所以需要转换成数组进行操作
  s = s.split("");
  // 每2k翻转前k个字符
  for (let start = 0; start < s.length; start = start + 2 * k) {
    let left = start,
      right = start + k - 1;
    if (right > s.length) right = s.length - 1;
    while (left < right) {
      let temp = s[left];
      s[left] = s[right];
      s[right] = temp;
      left = left + 1;
      right = right - 1;
    }
  }
  return s.join("");

卡码网:54.替换数字 

题目链接:54. 替换数字(第八期模拟笔试)

这个先用循环的方式将数字替换,这个用到了ACM模式,先熟悉了ACM模式的代码,以下是JS(Node)的方式

function replaceletter(s) {
    let result = '';
    for (let i = 0; i < s.length; i++) {
        if (!isNaN(s[i])) {  // 检查字符是否是数字
            result += 'number';
        } else {
            result += s[i];
        }
    }
    return result
}

var readline = require('readline');
const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
});
let current = ''
rl.on('line', function(line){
   //line为输入的单行字符串,split函数--通过空格将该行数据转换为数组。
   current = line
   console.log(replaceletter(current))
});

 151.翻转字符串里的单词 

题目链接:. - 力扣(LeetCode)

这道题采用 1.去除多余空格 2. 反转整个字符串 3.反转单个单词的方式,将双指针方法又复习了一遍去除重复元素,这里结尾的逻辑要想清楚

function removeUnusedSpace(arr) {
    let left = 0, right = 0;
    // 这里用 while,条件判断后 left + 1
    while(left < arr.length) {
        if (arr[left] === ' ' && (left === 0 || arr[left - 1] ===  arr[left])) {
            left = left + 1
        } else {
            arr[right] = arr[left]
            right = right + 1
            left = left + 1
        }
    }
    console.log(arr)
    // 这里应该是去处理 right 当前到达的地方,而不是当前数组最后 ,因为后面的都是末尾空格的情况
    // 判断和 left 前一个字符相等都是‘ ’ 的时候已经 left + 1了
    // 之前最后一次循环 right+1了,如果这个是空格,那么只取到 right
    arr.length = arr[right - 1] === ' ' ? right - 1 : right;
    return arr
}

function reverseAllWords(arr) {
    let left = 0, right = arr.length - 1
    while (left < right) {
        [arr[left], arr[right]] = [arr[right], arr[left]]
        left = left + 1;
        right = right - 1
    }
    return arr
}

function reverseWord(arr, left, right) {
    while (left < right) {
        [arr[left], arr[right]] = [arr[right], arr[left]]
        left = left + 1;
        right = right - 1
    }
    return arr
}

var reverseWords = function (s) {
     const sArr = s.split('')
    const newArr = removeUnusedSpace(sArr)
    let reversedArr = reverseAllWords(newArr)
    let left = 0, right = 0; 
    for(; right < s.length; right = right + 1) {
        if(!reversedArr[right + 1] === ' ' && right !== s.length - 2) continue
        if(reversedArr[right + 1] === ' ' || right === s.length - 1) {
            reversedArr = reverseWord(reversedArr, left, right)
            left = right + 2
        } 
    }
    return reversedArr.join('')
};

卡码网:55.右旋转字符串 

题目链接: 55. 右旋字符串(第八期模拟笔试)

太忙了暂时没空看了,有空再练习

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值