尼采般地抒情

公告栏

此网站主题为本人手写主题,主题还在开发中……


作者:尼采般地抒情

站点信息

文章数目:296
已运行时间:
目录
  1. 解决思路
  2. 代码实现
  3. 优化方案
    1. 利用正则表达式来切换原字符串

尼采般地抒情

尼采般地抒情

公告栏

此网站主题为本人手写主题,主题还在开发中……


作者:尼采般地抒情

站点信息

文章数目:296
已运行时间:

题目链接:

解决思路

  • 数学规律就是将字符串按照一整个 0 或 1切割开来,将其放入数组 arr,然后 arr 中相邻的元素(字符串)进行字符串长度比较大小,取小的,最后所有相邻的元素比较后的所有相加就是所需结果
  • 将字符串按照一整个 0 或 1切割开来:先对字符串遍历,找到异元素,记录其下标,存为数组 arr;然后利用 splice 方法+ arr 数组进行切割为目标数组

代码实现

将上述解决思路用代码实现如下:

function countBinarySubstrings(s: string): number {
  let flag: string = s[0];
  let arr: number[] = [];
  let arr_target: string[] = [];
  for (let i: number = 0; i < s.length; i++) {
    if (s[i] !== flag) {
      arr.push(i);
      flag = s[i];
    }
  }
  arr.forEach((data: number, index: number) => {
    if (index === 0) {
      arr_target.push(String(s.slice(0, data)));
      // 分割数组只有一个元素情况下
      if (arr.length === 1) arr_target.push(String(s.slice(data, s.length)));
    } else if (index === arr.length - 1) {
      arr_target.push(String(s.slice(arr[index - 1], data)));
      arr_target.push(String(s.slice(data, s.length)));
    } else {
      arr_target.push(String(s.slice(arr[index - 1], data)));
    }
  });
  let result: number = 0;
  arr_target.forEach((data: string, index: number) => {
    if (index < arr_target.length - 1)
      result += Math.min(
        String(data).length,
        String(arr_target[index + 1]).length
      );
  });
  return result;
}

console.log(countBinarySubstrings("1100"));
  • 对上述逻辑的小优化:上面是利用 arr 还转换为原只含 0、1 的数组,但是可以利用 arr 直接进行求算结果
function countBinarySubstrings(s: string): number {
  let flag: string = s[0];
  let arr: number[] = [];
  let result: number = 0;
  for (let i: number = 0; i < s.length; i++) {
    if (s[i] !== flag) {
      arr.push(i);
      flag = s[i];
    }
  }
  arr.forEach((data: number, index: number) => {
    if (index === 0) {
      arr.length === 1
        ? (result += Math.min(data, s.length - data))
        : (result += Math.min(data, arr[index + 1] - data));
    } else if (index === arr.length - 1) {
      result += Math.min(data - arr[index - 1], s.length - data);
    } else {
      result += Math.min(arr[index + 1] - data, data - arr[index - 1]);
    }
  });
  return result;
}

最后优化效果如下
image.png

优化方案

在官网解决方案中,看到其他的解决方案:

利用正则表达式来切换原字符串

s.match(/([1]+)|([0]+)/g);

上面的正则表达式就能实现如下效果…………

["00", "11", "00", "11"];

正则表达式太重要了!!
得到上述数组再进行数组内相邻元素比较元素字符串长度取小值,然后相加,类似上面方法即可。

评论区

Beaudar Twikoo

最新评论

Loading...