代码随想录算法题训练营Day6

50 阅读2分钟

242.有效的字母异位词

本题应用哈希表,数组就是一种哈希表,只是键是从0开始逐渐递增的。
利用数组特性可以将对应的26个字母转换成他们的ASCII编码当作键存入数组中,因为字母a的ASCII值是97,我们让后面字母的ASCII值都减去97(base),以节省数组空间。 遍历S字符串,将对应的字母都加入哈希表,再遍历T字符串,将对应的字母一一减去。在遍历T的时候,如果出现某个字母在他数组中的键对应的值为0,说明出现了T和S中不匹配的字母出现了,则return false; 如果遍历完了没有return flase,说明加进来的字母又一一消掉了,此时return true;

349.两个数组的交集

本题应用集合,因为不需要键,只需要无需的值存放在一个集合里。使用集合需要new一个Set出来。先把数组nums1和nums2排序,将数字多的数组放进作为“库”的集合1里,后循环数组2,将每一项和集合1里面的元素对比,如果集合1中有这个元素,就将元素放进结果集合2里。最后返回将集合2转为数组的结果。
切记要返回数组,而不是返回集合return Array.from(res);可以将集合变为数组。 出现TYPEERROR即是返回的数据类型出现了问题。

202.快乐数

重点是每次计算一轮的小函数。注意n%10获取的是这个数个位上的数字。 n=Math.floor(n/10);获取的是除了个位数其余位上的数字。

var caculate=function(n){
  let sum=0;
  while(n) {
    sum+=(n%10)**2;
     n=Math.floor(n/10);
  }
  return sum;
}

然后开始写核心代码。判断n是1吗?是1直接返回True。n不是1并且在集合中没有的话,加入集合。然后caculate(n)进行下一轮计算。一旦n算出在集合中已经有了的数字,就return false。直到n计算成为了1。return true;

1.两数之和

两数之和用的哈希表map结构。这个题是我每做一次都要感叹哈希表的结构和用法是如此的精妙,这个题放在leetcode上面第一题也是挺迷惑的,让人以为它特别的简单。忍不住贴出这道题的全部代码,没有一个字符是多余的。而且重点是把元素的值当作key,把元素下标值当作value!!!。这是区别于我们一般想法的一点。

var twoSum = function (nums, target) {
  let hash = {};
  for (let i = 0; i < nums.length; i++) {
    if (hash[target - nums[i]] !== undefined) {
      return [i, hash[target - nums[i]]];
    }
    hash[nums[i]] = i;
  }
  return [];
};