每日一练---codewars3

比较两个字符串
var s1 = "mmmmm m nnnnn b&friend&Paul has heavy hats! &"
var s2 = "my frie n d Joh n has ma n b ma n b frie n ds n&"
====> "1:mmmmmm/=:nnnnnn/1:aaaa/1:hhh/2:yyy/2:dd/2:ff/2:ii/2:rr/=:ee/=:ss"
题目难度:4kyu

思路:

  • 1、2代表是传入的第几个字符串, = 代表两个元素出现次数相同
  • 首先把整个传入的字符串变成对象形式
// obj 默认传参   start 默认传参
function getStrObj(str, obj = {}, start = 0,) {
    // 字符串正则匹配 只获取小写的英文==>数组===>字符串===>变成数组====>根据英文字符顺序排序====>字符串
    str = str.match(/[a-z]/g).join('').split('').sort().join('')
    // 默认从 0 开始,获取首次竖线的元素
    var ele = str.charAt(start);
    // 获取该元素最后出现的位置  计算出现次数  num - start + 1 (0,1  1 - 0 = 1 再加上 1 是个数,很简单的道理)
    var num = str.lastIndexOf(ele);
    // 给 obj 赋值 键为元素  值为出现的次数
    obj[ele] = num - start + 1;
    // 如果 num 不是最后一个 递归
    if (num != str.length - 1) {
        // 传入当前的str 已经赋值的obj  和num+1
        return getStrObj(str, obj, num + 1)
    } else {
        // 得出最后的 obj
        return obj
    }
}
  • 开始进行比较
function mix(s1, s2) {
    // 把 s1 和 s2 变为新的对象
    var newS1 = getStrObj(s1)
    var newS2 = getStrObj(s2)
    // 把新的对象的键合并为一个数组并去重
    var keys = new Set(Object.keys(newS1).concat(Object.keys(newS2)));
    var res = [];
    // 循环遍历  keys 数组
    keys.forEach(key => {
        // c1 如果 newS1 中存在则取值不存在即为0,c2 同理,count 取 c1、c2 中大的那个值
        var c1 = newS1[key] || 0, c2 = newS2[key] || 0, count = Math.max(c1, c2);
        // 只取count大于1的值
        if (count > 1) {
            // [1, '=', 2][索引]
            var from = [1, '=', 2][Math.sign(c2 - c1) + 1];
            // 创建长度为 count 的数组 值为key 最后变成一个长度为 count 值为 count 个 key 的字符串
            var str = [...Array(count)].map(_ => key).join('');
            res.push(from + ':' + str);
        }
    });
    // 排序之后 变成字符串
    return res.sort((a, b) => {
        return b.length - a.length || (a < b ? -1 : 1)
    }).join('/');
}

你可能感兴趣的:(每日一练---codewars3)