力扣练习题

49.字母异位词分组

strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
var groupAnagrams = function(strs) {
    var map=new Map();
    strs.forEach(item=>{  //数组里面原来的数据为item
        let temp=Array.from(item);  //排序后的为temp
        temp.sort();
        //把数组里面的每一项变成标准顺序排列[ 'a', 'e', 't' ][ 'a', 'e', 't' ][ 'a', 'n', 't' ][ 'a', 'e', 't' ][ 'a', 'n', 't' ][ 'a', 'b', 't' ]
        //console.log(temp)  //temp=[ 'a', 'e', 't' ]
        let key=temp.toString();  
        //console.log(key)   //key=a,e,t
        let list = map.get(key)?map.get(key):new Array();  //?  数组
        list.push(item);
        map.set(key,list);
    })
    
    /* 
    console.log(map)
    Map {
  'a,e,t' => [ 'eat', 'tea', 'ate' ],
  'a,n,t' => [ 'tan', 'nat' ],
  'a,b,t' => [ 'bat' ]
}
    */
/* 
console.log(map.values())
[Map Iterator] { [ 'eat', 'tea', 'ate' ], [ 'tan', 'nat' ], [ 'bat' ] }
*/
    return Array.from(map.values())
    
}
//groupAnagrams(strs)
console.log(groupAnagrams(strs))

方法:字符串数组,把他们每一项转成数组

Array.from()

array.toString()

返回map中的value:map.values()

13、罗马数字转整数

var s = "MCMXCIV"
var romanToInt = function(s) {
    var sum=0;  //学会map的格式
    let map = new Map([['I',1],['V',5],['X',10],['L',50],['C',100],['D',500],['M',1000]])
    //console.log(map)
    for(let i=0;i<s.length;i++){
        let res = map.get(s[i])
        let tem = map.get(s[i+1])
        if(res<tem){  //如果前者比后者小,那么
            sum =sum-res
        }else{
            sum =res+sum
        }
    }
    return(sum)
};
romanToInt(s)

收获:

  • map相关操作:

let map = new Map();
// 增
// 1.
let map1 = new Map([['a',1],['b',2],['c',3]])
// 2.
map.set('a',1);
map.set('b',2);
map.set('c',3);

// 删
map.delete('c');

// 清除
map.clear();

// 取值
map.get('c');

// 是否存在
map.has('c');

// 长度
map.size;
 

  • 迭代:

let map = new Map([['a',1],['b',2],['c',3]])
// 遍历
// 1.
map.forEach((value, key) => {
    console.log(key, value)
});
// a,1
// b,2
// c,3

// 2.
for (const item of map) {
    console.log(item);
}
// [a,1]
// [b,2]
// [c,3]

// keys
map.keys();
// ['a','b','c']

// values()
map.values();
// 1
// 2
// 3

// entries()
map.entries();
// [a,1]
// [b,2]
// [c,3]
 

  • 应用举例:

function contrast(arr) {
    const map = new Map()
    const result = []
    for (let i = 0; i < arr.length; i++) {
        if (map.has(arr[i].key)) {
            map.set(arr[i].key, true)
        } else {
            map.set(arr[i].key, false)
            result.push(arr[i])
        }
    }
    return result
}
 

169、多数元素

var nums = [2, 2, 1, 1, 1, 2, 2];
var majorityElement = function (nums) {
  let map = new Map();
  for (const num of nums) {
    if (map.has(num)) {
        let i=map.get(num)
        i++;
        map.set(num,i)
    } else {
      map.set(num, 1);
     // console.log(map);
    }
  }
  let res=map.values();
console.log(res)
};
majorityElement(nums);

242、有效的字母异位词

方法一、异位词想到排序,按同一种标准排列起来然后看是否相同

 s = "anagram", s = "gnaaram"
var isAnagram = function (s) {
    console.log(s)  //anagram   //字符串  
    console.log([...s]) */
    /* 
    [
     'a', 'n', 'a',
     'g', 'r', 'a',
     'm'
    ]
    */
    /* console.log([...s].join(''))  //anagram
};
isAnagram(s)

收获:

[...s]可以把字符串转化成数组

sort()是数组的方法

以上可以这样操作:

var isAnagram = function(s, t) {
    return [...s].sort().join('')===[...t].sort().join('')
};

方法二:哈希,数组结构实现

s = "anagram",t = "nagaram"
var isAnagram = function (s) {
    if(s.length!=t.length){
        return false
    }
    const record=new Array(26).fill(0);
    let base='a'.charCodeAt() //97  console.log('b'.charCodeAt())  98 console.log('c'.charCodeAt()) 99 console.log('z'.charCodeAt())  122
    for(const i of s){
        record[i.charCodeAt()-base]++;  //通过基准找到位置,使得该位置上数组的值从0变成1
    }
   for(const i of t){
       if(!record[i.charCodeAt()-base]){return false}
    record[i.charCodeAt()-base]--;
   }
   return true
}
isAnagram(s,t)

我自己用map实现的,最后不知到怎么输出?

s = "anagram",t = "nagaram"
var isAnagram = function (s) {
    var maps=new Map();
    var mapt=new Map();
    [...s].forEach(item => {
        maps.has(item)?maps.set(item,maps.get(item)+1):maps.set(item,1)
    });
    [...t].forEach(item => {
        mapt.has(item)?mapt.set(item,mapt.get(item)+1):mapt.set(item,1)
    });
   // console.log(maps)
    //console.log(mapt)
  //maps、mapt内容一样,顺序不同,怎么判断他们是一样的

//这里是看的力扣,但是不懂
    const ls1 = Object.entries(maps)  //?
    console.log(ls1)
    const ls2 = Object.entries(mapt)  //逐位判断  ?不理解
  return ls1.length === ls2.length && !ls1.find(item => !map2[item[0]] || map2[item[0]] !== item[1])
}
isAnagram(s)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值