面试题 17.07. 婴儿名字 总结

1.Set()
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。类似于python中的元组。
2.forEach()方法
forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。
function(currentValue, index, arr)
3.slice()方法
slice() 方法可从已有的数组中返回选定的元素。
arrayObject.slice(start,end)
注意,该方法并不会修改数组,而是返回一个子数组。如果想删除数组中的一段元素,应该使用方法 Array.splice()。
4.for…of 循环
for in 和 for of的区别是:in 是遍历对象,of是遍历值
for…of 语句创建一个循环来迭代可迭代的对象。在 ES6 中引入的 for…of 循环,以替代 for…in 和 forEach() ,并支持新的迭代协议。for…of 允许你遍历 Arrays(数组), Strings(字符串), Maps(映射), Sets(集合)等可迭代的数据结构等。
5.es6新增语法${}
这是es6中新增的字符串方法,将字符串变量用 包 起 来 , 例 如 ‘ {}包起来,例如 ` {prop}(${obj[prop]})`

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>力扣</title>
</head>
<body>
<!--每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量。有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来。给定两个列表,一个是名字及对应的频率,另一个是本质相同的名字对。设计一个算法打印出每个真实名字的实际频率。注意,如果 John 和 Jon 是相同的,并且 Jon 和 Johnny 相同,则 John 与 Johnny 也相同,即它们有传递和对称性。
在结果列表中,选择字典序最小的名字作为真实名字。
示例:
输入:names = ["John(15)","Jon(12)","Chris(13)","Kris(4)","Christopher(19)"], 
synonyms = ["(Jon,John)","(John,Johnny)","(Chris,Kris)","(Chris,Christopher)"]
输出:["John(27)","Chris(36)"]
-->
<!--**
 * @param {
    
    string[]} names
 * @param {
    
    string[]} synonyms
 * @return {
    
    string[]}
 */-->
 <script>
     //并查集类
     class MFS{
    
    
         //constructor函数用来接收传过来的参数
         constructor(arr){
    
    
             this.root = {
    
    }
             arr.forEach(name=>{
    
    
                 this.root[name] = name//初始化root,把名字指向自身,也就是建立集合
             })
         }
     merge  (a, b)  {
    
    //a,b是建立亲戚关系的
         let ar = this.find(a)
         let br = this.find(b)
         if(ar === br) return //字典序相同说明已经有根了
         if(ar > br){
    
    //根都是指向自己的,从字典序大的指向字典序小的,字典序最小的还是指向他自己
             this.root[ar] = br
         }else{
    
    
             this.root[br] = ar
         }
     }
     find(m){
    
    //间接值相同,就要找根,找元素的根
        let mr = m
        while(this.root[mr]!==mr){
    
    
            mr = this.root[mr]//一个有根,一个根是自己,把有根的返回根的值去和没根的连接(字典序最小的作为代表元)
        }
        return mr
     }
     }
     var trulyMostPopular = function(names,synonyms){
    
    
         //获取全部名字
         let set = new Set()
         for(let n of names){
    
    
             let a = n.split('(')[0]
             set.add(a)
         }
         for(let s of synonyms){
    
    
             let a = s.split(',')[0].slice(1)
             let b = s.split(',')[1].slice(0,-1)
             set.add(a)
             set.add(b)
         }
         //把类似的合并到同一集合(把有关系的连接起来)
         let list = [...set];//把set数据类型放到数组里面
         let mfs = new MFS(list)//让list里面有所有的名字指向自身
         for(let s of synonyms){
    
    
             let a = s.split(',')[0].slice(1)
             let b = s.split(',')[1].slice(0,-1)
             mfs.merge(a,b)//把a,b连接起来(有亲戚关系的连起来)
         }
         //把同类的次数合并
         let obj = {
    
    }//obj用来存放相同的类型的次数
         for(let n of names){
    
    
             let m = n.split('(')[0]
             let name = mfs.find(m)//找到元素的根,以根为名,最小字典序
             let times = +(n.split('('))[1].slice(0,-1)//把names中的数字即次数取出来
             obj[name] = (obj[name]||0) + times//obj为空就是0
         }
         //转成数组
         let res = []
         for(let prop in obj){
    
    //in取对象名
             res.push(`${
      
      prop}(${
      
      obj[prop]})`)//字符串拼接,用``反单引号与${}配合拼接,${}包裹拼接的变量
         }
         return res
     }
 </script>


</body>
</html>

猜你喜欢

转载自blog.csdn.net/Vevean2545116309/article/details/110733950
今日推荐