【问题标题】:Codewars Challenge - The Deaf Rats of Hamelin - JavaScript - How to Split a String by a Certain Set of Characters?Codewars 挑战 - Hamelin 的聋鼠 - JavaScript - 如何通过特定字符集拆分字符串?
【发布时间】:2019-12-23 00:25:56
【问题描述】:

Link to challenge

本质上,这个想法是,如果一只老鼠 - O~ - 正对着吹笛者 - P - 那么它就会朝着正确的方向前进。

这是一只向左走的老鼠:O~

这是一只向右走的老鼠:~O

我们想计算有多少“聋鼠”存在于一根绳子中——有多少是面向错误的方向。

这里有 1 只聋鼠:P O~ O~ ~O O~


我的逻辑是首先检查 Piper 是在字符串的左侧还是右侧。

如果他不是,那么我们需要根据Piper在字符串中的位置来拆分字符串,然后计算左侧有多少只老鼠没有面对他,右侧有多少只老鼠没有面对他。

var countDeafRats = function(town) {
  town = town.replace(/[ ]/g, '');
  let deafCount = 0;
  //if piper's on the left
  if (town[0] === 'P') {
    for (let i = 0; i < town.length; i++) {
      if (town[i] === '~O') {
        deafCount ++;
      }
    }
  }
  //if piper's on the right
  if (town[town.length - 1] === 'P') {
    for (let j = 0; j < town.length; j++) {
      if (town[j] === 'O~') {
        deafCount ++;
      }
    }
  }
  let rats = town.split('P');
  console.log('ratssss', rats);
  let leftRats = [];
  let rightRats = [];
  return deafCount;
}

console.log(countDeafRats("~O~O P ~O~O"));

在上面的例子中,这里是一组老鼠:[ '~O~O', '~O~O' ] 所以右边有两只老鼠走错了路(聋老鼠)。

我想做的是将左右老鼠推入各自的阵列中,然后分别计算每个阵列中的聋鼠。

但我无法将字符串 ~O~O 拆分为 ~O 或 O~。

我想为leftRats 获取['~O', '~O'],为rightRats 获取['~O', '~O']。

我试过了:

leftRats.push(rats[0].split('~O'));
rightRats.push(rats[1].split('O~'));
console.log('leftRatsssss', leftRats);
console.log('rightRatssss', rightRats);

但它做的事情与预期的完全不同:

leftRatsssss [ [ '', '', '' ] ]
rightRatssss [ [ '~', 'O' ] ]

Split 不会将字符串 by 作为参数给出的字符串拆分。那么,这就是我的问题的真正意义所在 - 你如何将字符串拆分为特定的字符集?

即如果我想将字符串'the' 拆分为'he',我希望'the' 变为['t', 'he'] - 我已经尝试过正则表达式来处理这种情况?

console.log("the".split(/[he]/gi));

这似乎与我想要的相反。那么,有什么建议可以用给定的字符集分割字符串吗?

【问题讨论】:

    标签: javascript arrays string


    【解决方案1】:

    无论如何,您都可以通过P 拆分字符串,然后将每个段(P 的左侧和右侧)转换为每个 2 字符块的数组。例如~O~O P ~O~O 变成['~O', '~O'] 用于左侧块,['~O', '~O'] 用于右侧块。然后数出O~在第一个chunk中出现的次数,~O在第二个chunk中出现的次数:

    var countDeafRats = function(town) {
      const [leftRats, rightRats] = town
        .replace(/[^O~P]/g, '')
        .split('P')
        .map(segment => segment.match(/.{2}/g) || []);
      return (
        leftRats.reduce((a, rat) => a + (rat === 'O~'), 0) +
        rightRats.reduce((a, rat) => a + (rat === '~O'), 0)
      );
    }
    
    console.log(countDeafRats("~O~O P ~O~O"));

    【讨论】:

    • 我明白了,关键是使用此正则表达式 /.{2}/ 一次输入两个字符 match() - 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-24
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 2013-03-03
    相关资源
    最近更新 更多