字符串相关算法题

Posted by violetks on April 15, 2021

一、替换空格(牛客网)

请实现一个函数,将一个字符串中的每个空格替换成“%20”。
例1:We Are Happy 替换后 We%20Are%20Happy
例2:hello world 替换后 hello%20%20world

// 方法一:replaceAll
function replaceSpace (str) {
  return str.replaceAll(" ", "%20");
}
// 方法二:split、join
function replaceSpace (str) {
  return str.split(" ").join("%20");
}
// 方法三:用新的数组存
function replaceSpace (str) {
  let result = [];
  for (let i = 0; i < str.length; i++) {
    if (str[i] === " ") {
      result.push("%20")
    } else {
      result.push(str[i])
    }
  }
  return result.join("").toString()
}
  • split(),将字符串分割成数组。
  • join(separator),把数组中的所有元素放入一个字符串,通过指定分隔符分隔。

二、斐波那契数列(牛客网)

斐波那契数列是指1、1、2、3、5、8、13、21、34、…,现在要求输入一个整数 n,请你输出斐波那契数列的第 n 项(从 0 开始,第 0 项为 0)。 n<=39

// 方法一:递归,复杂度较高,运行时间超过 2 秒了
function Fibonacci (n) {
  if (n < 2) {
    return n;
  } else {
    return Fibonacci(n-1) + Fibonacci(n-2);
  }
}

// 方法二:使用中间变量
function Fibonacci (n) {
  if (n < 2) {
    return n;
  }

  let a = 0, b = 1;
  for (let i = 2; i < n; ++i) {
    let c = a + b;
    a = b;
    b = c;
  }

  return a + b;
}

三、字符串压缩(力扣)

比如,字符串aabcccccaaa会变为a2b1c5a3。若压缩后的字符串没有变短,则返回原先的字符串。假设字符串中只包含大小写英文字母。
例1:输入 aabcccccaaa 压缩后输出 a2b1c5a3
例2:输入 abbccd 压缩后输出 abbccd,因为 a1b2c2d1 比原字符串长度更长。

function compressString (str) {
  let res = [];
  let count = 1;
  for (let i = 0; i < str.length; i++) {
    if (str[i] === str[i + 1]) {
      count++;
    } else {
      res.push(str[i]);
      res.push(count);
      count = 1;
    }
  }
  return res.join("").length >= str.length ? str : res.join("");
}