打卡-算法训练营-Day8 | 344. 反转字符串;541. 反转字符串II;卡码网:54.替换数字

70 阅读2分钟

反转字符串

leetcode链接:leetcode.cn/problems/re…

简单题,用双指针法,两个指针遍历着向中间收缩

反转字符串II

leetcode链接:leetcode.cn/problems/re…

在344. 反转字符串题的基础上多了些的反转规则,没有用到什么算法,就是模拟

var reverse = function(arr, left, right) {
    while (left < right) {
        let temp = arr[left];
        arr[left] = arr[right];
        arr[right] = temp;
        left++;
        right--;
    }
}

var reverseStr = function(s, k) {
    let strArr = s.split('');
    let size = strArr.length;

    // fast指针先走2k步
    let slow = 0;
    let fast = 2 * k - 1;

    while (fast < size) {
        // 反转[slow, slow+k-1]
        let left = slow;
        let right = slow + k - 1;

        reverse(strArr, left, right);
        
        // 更新slow和fast指针
        slow = fast + 1;
        fast += 2*k;
    }

    // fast指针越界的时候,重新指向数组末尾
    fast = size - 1;
    if (fast - slow + 1 < k) {
        reverse(strArr, slow, fast);
    } else {
        reverse(strArr, slow, slow + k - 1);
    }

    return strArr.join('');
};

上面的代码可以优化下,只使用一个循环变量(每隔2k个字符的前k个字符进行反转)


var reverseStr = function(s, k) {
    let strArr = s.split('');
    let size = strArr.length;

    for (let i = 0; i < size; i += 2*k) {
        if (i + k - 1 < size) {
            reverse(strArr, i, i + k - 1);
        } else {
            reverse(strArr, i, size - 1);
        }
    }

    return strArr.join('');
};

替换数字

链接:kamacoder.com/problempage…

看到题目懵了,这么简单的题目,先将字符串转为数组,遍历数组判断元素是不是数字,是数字的话替换为number,最后返回新的字符串

const readline = require('readline');

const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
});

rl.on('line', function(line){
   var strArr = line.split('');
   for (let i = 0; i < strArr.length; i++) {
       if (Number.isNaN(Number(strArr[i]))) {
           continue;
       } else {
           strArr[i] = 'number';
       }
   }
   console.log(strArr.join(''));
});

看了卡哥的方法后才明白不能使用库函数,要自己实现判断数字和字母的判断方法,并且使用双指针法,扩充数组的长度后,依次往里面填充新的字符

const readline = require('readline');

const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
});

rl.on('line', function(input){
    const num0 = "0".charCodeAt();
    const num9 = "9".charCodeAt();
    const a = "a".charCodeAt();
    const z = "z".charCodeAt();
    
    function isAZ(str) {
        return str >= a && str <= z;
    }
    
    function isNumber(str) {
        return str >= num0 && str <= num9;
    }
   

   let n = 0; // 存储新数组的长度
   for (let i = 0; i < input.length; i++) {
       const val = input.charCodeAt(i);
       if (isNumber(val)) {
           n += 6;
       }
       if (isAZ(val)) {
           n++;
       }
   }
   
   let result = new Array(n).fill(0);
   let index = 0;
   let i = 0;

  while (i < result.length) {
      const val = input.charCodeAt(index);
      // 遇到数字填充number进去
      if (isNumber(val)) {
        result[i++] = 'n';
        result[i++] = 'u';
        result[i++] = 'm';
        result[i++] = 'b';
        result[i++] = 'e';
        result[i++] = 'r';
      }
      if (isAZ(val)) {
          result[i] = input.charAt(index);
          i++;
      }
      index++;
  }
  
  console.log(result.join(''));
});