[路飞]_js算法实现:平方数之和 二分查找 两数之和 快乐数 有效的字母异位词

168 阅读1分钟

平方数之和

问题:给定一个非负整数 c ,你要判断是否存在两个整数 ab,使得 a2 + b2 = c

/**
 * @param {number} c
 * @return {boolean}
 */
var judgeSquareSum = function(c) {
  // 双指针
      let left=0;
      let right=Math.floor(Math.sqrt(c));
      while(left<=right){
        let sum=left*left+right*right;
        if(sum==c){
          return true
        }else if(sum<c){
         left++;
        }
        else{
         right--
        }
        }
     return false
};

二分查找

问题:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。(leetcode 704)

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
 let left=0;
      let right=nums.length-1;
      while(left<=right){
        let cur=Math.floor((right-left)/2)+left;
        if(nums[cur]<target){
         left=cur+1;
        }else if(nums[cur]>target){
         right=cur-1
        }else{
         return cur
        }
      }
      return -1;
};

两数之和

问题:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。(leetcode 1)

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
      let map=new Map();
      for(let i=0;i<nums.length;i++){
          if(map.has(target-nums[i])){
              return [map.get(target-nums[i]),i]
          }else{
               map.set(nums[i],i)
          }
      }
      return [];
};

快乐数

问题:编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果 可以变为 1,那么这个数就是快乐数。

如果 n 是快乐数就返回 true ;不是,则返回 false 。(leetcode 202)

/**
 * @param {number} n
 * @return {boolean}
 */
//利用链表的快慢指针来写
var isHappy = function(num) {
 if(num==1) return true;
        let slow=getSquare(num);
        let fast=getSquare(getSquare(num));
        while(slow!=fast){
            slow=getSquare(slow);
            fast=getSquare(getSquare(fast));
        }
        
        return fast==1
};
var getSquare=function(num){
            let sum=0;
            while(num>0){
                sum+=Math.pow(num%10,2)
                num=parseInt(num/10);
            }
            return sum
}

有效的字母异位词

问题:给定两个字符串 *s**t* ,编写一个函数来判断 *t* 是否是 *s* 的字母异位词。

注意:*s**t* 中每个字符出现的次数都相同,则称 *s**t* 互为字母异位词。(leetcode 242)

思路:

方法一:排序 t 是 s 的异位词等价于「两个字符串排序后相等」。且t与s长度要一致。

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