简单算法

94 阅读1分钟

1.字符串

练习题
  • 反转字符串中的单词
    /* 
    给定一个字符串,你需要反转字符串中每个单词的字符顺序,
    同时仍保留空格和单词的初始顺序
    示例: 输入:"Let`s take LeetCode constest"
          输出:"s`teL ekat edoCteeL tsetnoc"
    注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格
    */
    
    // 思路:分隔句子,拿到单词后,遍历单词反转
    inverseWord=(s)=>{
       return s.split(\s/g).map(
           word=>word.split("").reverse().join("")
        ).join(" ")
    }
    
    // 方法二:正则匹配单词,遍历单词反转
    inverseWord=(s)=>{
       return s.match(/[\w']+/g).map(
           word=>word.split("").reverse().join("")
        ).join(" ")
    }
  • 计数二进制子串
/*
    给定一个字符串s,
    计算具有相同数量0和1的非空(连续)子字符串的数量,
    并且这些子字符串的所有0和所有1都是组合在一起的
    重复出现的子串要计算它们出现的次数
    示例:输入:"00110011"
          输出:6
    解释:有6个子串具有相同数量连续1和0
    "0011","01","1100","10","0011","01"
    注意:一些重复出现的子串要计算它们出现的次数
    另外"00110011"不是有效的子串,因为所有的0和1没有组合在一起
*/

// 思路:找抽象出来,每位至多出现一个子串,从第1到n-1位遍历
  countSubStr=(str)=>{
    let r =[] // 结果集
    // 找子集
    let match =(str)=>{
        let n =str.match(/^(0+|1+)/)[0]  // string
        let m = (n[0]^1).toString().repeat(n.length)
        let reg = new RegExp(`^(${n}${m})`)
        if(reg.test(str)){
            return RegExp.$1
        }
       return  ''
    }
    // 遍历
    for(let i=0, len=str.length-1;i<len;i++){
        let sub = match(str.slice(i))
        if(sub){
            r.push(sub)
        }
    }
      return r
  }

2.数组

3.正则

4.排序

5.递归