美文网首页前端从业人员技术贴
leetcode刷题记录 js算法与数据结构 基础篇(上)

leetcode刷题记录 js算法与数据结构 基础篇(上)

作者: 你都如何回忆我_z | 来源:发表于2019-07-04 11:31 被阅读7次

立志做一个情感博主的程序员


WechatIMG30.jpeg

1 #### 反转字符串中的单词
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc"

export default str => {
  // 1 将字符串切割成数组
  let arr = str.split(/\s+/g);
  // 2 然后再讲数据的每一项再切成数组[[abc], [bcd], [efg]]  从而利用数组的  reverse进行反转
  let result = arr.map(item => {
      return item.split('').reverse().join('')
  })
  return result.join(' ')
}
// 不懂split reverse join 和map方法的请自行百度

2 #### 计数二进制子串 (稍微有点复杂, 闲麻烦的直接跳过)
给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。
重复出现的子串要计算它们出现的次数。
示例1
输入: "00110011"
输出: 6
解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。
请注意,一些重复出现的子串要计算它们出现的次数。
另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。

示例2
输入: "10101"
输出: 4
解释: 有4个子串:“10”,“01”,“10”,“01”,它们具有相同数量的连续1和0。
注意:s.length 在1到50,000之间。 s 只包含“0”或“1”字符。

规律图

image.png

位运算符链接 不懂自己吸纳哦 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

var countBinarySubstrings = function(s) {
    let matchFn = (str) => {
        // 找出一边相同的数字
        let startNum = str.match(/^(1+|0+)/)[0];
        // ^ 不懂看官方解释    对于每一个比特位,当两个操作数相应的比特位有且只有一个1时,结果为1,否则为0。
        let endNum = (startNum[0] ^ 1).toString().repeat(startNum.length);
        // startNum[0] 这里说一下 为什么要取[0], 因为 ^ 操作符比较的事 比特位
        // 比特(位):英文bit,是计算机晶体管的一种状态(通电与断电).就是0与1,真与假,是计算机最基本的传输单位.
        // 所以只取一位
        let target = `${startNum}${endNum}`
        // 注意 只能从字符串的最开始匹配  。
        // 或者用正则完成 let regs = new RegExp(`^(${startNum}${endNum})`); return regs.test(str) ? `${startNum}${endNum}` : ''; 但是如果数字(比特位太多 动态生成的正则会爆)
          if (str.slice(0, target.length) === target) {
            return `${startNum}${endNum}`;
        }
        return '';
    };

    let arr = [];
    for(i = 0; i < s.length - 1; i++) {
        let match = matchFn(s.slice(i));
        if (match) {
            arr.push(match);
        }
    }
    return arr.length;
};
countBinarySubstrings('00110011');

3#### 电话号码的字母组合
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

1562230212545.jpg
var letterCombinations = function (digits) {
    // 存放数字对应的字母 
    let arr = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz'];
    let newDigits = digits.split('');
    // 输入数字 所对应的字母  比如输入'23' => ['abc', 'def']
    let proveArr = newDigits.map(index => {
        return arr[index];
    });

    // 如果输入为'', 则返回[]
    if (!digits) {
        return [];
    }
    // 如果输入的是个位数 则直接返回
    else if (digits.length === 1) {
        return proveArr[0].toString().split('');   
    }
    else {
        let fn = proveArr => {
            let endResult = [];
            // 第三步 需要便利proveArr, 让每一个字母进行组合
            for (let i = 0; i < proveArr[0].length; i++) {
                for (let j = 0; j < proveArr[1].length; j++) {
                    endResult.push(`${proveArr[0][i]}${proveArr[1][j]}`);
                }
            }
            // 这一步很关键, 每次合并数组的前两组字母, 然后再递归  直到数组长度只剩下1
            proveArr.splice(0, 2, endResult);
            if (proveArr.length > 1) {
                fn(proveArr);
            }
            else {
                return endResult;
            }
            return proveArr[0];
        };
        return fn(proveArr);
    }  
};

相关文章

网友评论

    本文标题:leetcode刷题记录 js算法与数据结构 基础篇(上)

    本文链接:https://www.haomeiwen.com/subject/wguocctx.html