平方数之和
问题:给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 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('')
};