【问题标题】:Create a function that accepts a string and groups repeated values创建一个接受字符串并将重复值分组的函数
【发布时间】:2020-03-03 19:01:53
【问题描述】:

创建一个接受字符串并将重复值分组的函数。这些组应具有以下结构:[[value, first_index, last_index, times_repeated], ..., [value, first_index, last_index, times_repeated]]。

  • 价值:正在评估的角色。
  • first_index:首次出现的字符索引。
  • last_index:最后出现的字符索引。
  • times_repeated:字符连续重复的次数。

示例

findRepeating("a") ➞ [["a", 0, 0, 1]]

findRepeating("aabbb") ➞ [["a", 0, 1, 2], ["b", 2, 4, 3]]

findRepeating("1337") ➞ [["1", 0, 0, 1], ["3", 1, 2, 2], ["7", 3, 3, 1]]

findRepeating("aabbbaabbb") ➞ [["a", 0, 1, 2], ["b", 2, 4, 3], ["a", 5, 6, 2], ["b", 7, 9, 3]]

我能够为独特的角色做到这一点。 但无法做到

字符连续重复的次数

我的密码

function findRepeating(str) {
    let unique = [...new Set([...str])]
    return unique.map(x=>[x,str.indexOf(x),str.lastIndexOf(x),[...str].filter(a=>a==x).length])
}

预期结果

Test.assertSimilar(findRepeating(''), [])
Test.assertSimilar(findRepeating('a'), [['a', 0, 0, 1]])
Test.assertSimilar(findRepeating('1337'), [['1', 0, 0, 1], ['3', 1, 2, 2], ['7', 3, 3, 1]])
Test.assertSimilar(findRepeating('aabbb'), [['a', 0, 1, 2], ['b', 2, 4, 3]])
Test.assertSimilar(findRepeating('addressee'), [['a', 0, 0, 1], ['d', 1, 2, 2], ['r', 3, 3, 1], ['e', 4, 4, 1], ['s', 5, 6, 2], ['e', 7, 8, 2]])
Test.assertSimilar(findRepeating('aabbbaabbb'), [['a', 0, 1, 2], ['b', 2, 4, 3], ['a', 5, 6, 2], ['b', 7, 9, 3]])
Test.assertSimilar(findRepeating('1111222233334444'), [['1', 0, 3, 4], ['2', 4, 7, 4], ['3', 8, 11, 4], ['4', 12, 15, 4]])
Test.assertSimilar(findRepeating('1000000000000066600000000000001'), [['1', 0, 0, 1], ['0', 1, 13, 13], ['6', 14, 16, 3], ['0', 17, 29, 13], ['1', 30, 30, 1]])

实际结果

Test Passed: Value == '[]'
Test Passed: Value == "[['a', 0, 0, 1]]"

Test Passed: Value == "[['1', 0, 0, 1], ['3', 1, 2, 2], ['7', 3, 3, 1]]"
Test Passed: Value == "[['a', 0, 1, 2], ['b', 2, 4, 3]]"
FAILED: Expected: "[['a', 0, 0, 1], ['d', 1, 2, 2], ['r', 3, 3, 1], ['e', 4, 4, 1], ['s', 5, 6, 2], ['e', 7, 8, 2]]", instead got: "[['a', 0, 0, 1], ['d', 1, 2, 2], ['r', 3, 3, 1], ['e', 4, 8, 3], ['s', 5, 6, 2]]"
FAILED: Expected: "[['a', 0, 1, 2], ['b', 2, 4, 3], ['a', 5, 6, 2], ['b', 7, 9, 3]]", instead got: "[['a', 0, 6, 4], ['b', 2, 9, 6]]"
Test Passed: Value == "[['1', 0, 3, 4], ['2', 4, 7, 4], ['3', 8, 11, 4], ['4', 12, 15, 4]]"
FAILED: Expected: "[['1', 0, 0, 1], ['0', 1, 13, 13], ['6', 14, 16, 3], ['0', 17, 29, 13], ['1', 30, 30, 1]]", instead got: "[['1', 0, 30, 2], ['0', 1, 29, 26], ['6', 14, 16, 3]]"

function findRepeating(str) {
	let unique = [...new Set([...str])]
	return unique.map(x=>[x,str.indexOf(x),str.lastIndexOf(x),[...str].filter(a=>a==x).length])
}
console.log("Fails   ",JSON.stringify(findRepeating('addressee')),"\nexpected", `[['a',0,0,1],['d',1,2,2],['r',3,3,1],['e',4,4,1],['s',5,6,2],['e',7,8,2]]`)
console.log("Fails   ",JSON.stringify(findRepeating('aabbbaabbb')),"\nexpected", `[['a',0,1,2],['b',2,4,3],['a',5,6,2],['b',7,9,3]]`)
console.log("Passes  ",JSON.stringify(findRepeating('1111222233334444')),"\nexpected", `[['1',0,3,4],['2',4,7,4],['3',8,11,4],['4',12,15,4]]`)
console.log("Fails   ",JSON.stringify(findRepeating('1000000000000066600000000000001')),"\nexpected", `[['1',0,0,1],['0',1,13,13],['6', 14,16,3],['0',17,29,13],['1',30,30,1]]`)

【问题讨论】:

    标签: javascript arrays string loops


    【解决方案1】:

    您可以使用正则表达式获取相同字符的数组,该正则表达式查找一个字符和相同的后续一次作为一个组并映射所需的信息。

    function findRepeating(string) {
        var i = -1;
        return (string.match(/(.)\1*/g) || []).map(s => [s[0], ++i, i += s.length - 1, s.length]);
    }
    
    console.log(findRepeating(""));           // []
    console.log(findRepeating("a"));          // [["a", 0, 0, 1]]
    console.log(findRepeating("aabbb"));      // [["a", 0, 1, 2], ["b", 2, 4, 3]]
    console.log(findRepeating("1337"));       // [["1", 0, 0, 1], ["3", 1, 2, 2], ["7", 3, 3, 1]]
    console.log(findRepeating("aabbbaabbb")); // [["a", 0, 1, 2], ["b", 2, 4, 3], ["a", 5, 6, 2], ["b", 7, 9, 3]]

    【讨论】:

    • @AshishKamble,你不明白哪一部分?
    • 过了一会儿,我明白了,我需要一些时间才能理解你的回答逻辑,Awsome,你可以多写一些支持伟大代码的词
    【解决方案2】:

    您的代码假定每个组都与不同的角色有关。一旦您有两个具有相同字符的组,lastIndex 之类的内容就会给出错误的结果。

    只需使用普通的 for 循环。

    function findRepeating(str) {
        let result = [];
        let start = 0;
        for (let i = 0; i < str.length; i++) {
            if (str[i] !== str[i+1]) {
                result.push([str[i], start, i, i-start+1]);
                start = i+1;
            }
        }
        return result;
    }
    
    console.log(findRepeating(''), [])
    console.log(findRepeating('a'), [['a', 0, 0, 1]])
    console.log(findRepeating('1337'), [['1', 0, 0, 1], ['3', 1, 2, 2], ['7', 3, 3, 1]])
    console.log(findRepeating('aabbb'), [['a', 0, 1, 2], ['b', 2, 4, 3]])
    console.log(findRepeating('addressee'), [['a', 0, 0, 1], ['d', 1, 2, 2], ['r', 3, 3, 1], ['e', 4, 4, 1], ['s', 5, 6, 2], ['e', 7, 8, 2]])

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 2021-11-29
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多