* @lc app=leetcode.cn id=704 lang=javascript
*
* [704] 二分查找
*/
// @lc code=start
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function (nums, target) {
// 左右指针
let left = 0,
right = nums.length - 1
while (left <= right) {
// 右移一位,相当于除2并向下取整
//let center = (left + right) >> 1
let center = Math.floor((left + right) / 2)
if (target === nums[center]) return center
if (target > nums[center]) {
left = center + 1
} else {
right = center - 1
}
}
return -1
};
// @lc code=end
/*
* @lc app=leetcode.cn id=977 lang=javascript
*
* [977] 有序数组的平方
*/
// @lc code=start
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function (nums) {
let n = nums.length;
let ans = [];
for (let i = 0, j = n - 1, pos = n - 1; i <= j;) {
let squ_i = nums[i] * nums[i];
let squ_j = nums[j] * nums[j];
// 选择双指针中较大的一方逆序插入目标数组
if (squ_i > squ_j) {
ans[pos] = squ_i
i++
} else {
ans[pos] = squ_j
j--
}
// 每次操作都将当前位置前移
pos--
}
return ans
};
// @lc code=end
/*
* @lc app=leetcode.cn id=567 lang=javascript
*
* [567] 字符串的排列
*/
// @lc code=start
/**
* @param {string} s1
* @param {string} s2
* @return {boolean}
*/
var checkInclusion = function (s1, s2) {
let len1 = s1.length, len2 = s2.length
if (len1 > len2) return false
let cnt1 = new Array(26).fill(0)
let cnt2 = new Array(26).fill(0)
for (let i = 0; i < len1; i++) {
cnt1[s1[i].charCodeAt() - 'a'.charCodeAt()]++
cnt2[s2[i].charCodeAt() - 'a'.charCodeAt()]++
}
if (cnt1.toString() === cnt2.toString()) return true
for (let i = len1; i < len2; i++) {
cnt2[s2[i].charCodeAt() - 'a'.charCodeAt()]++
cnt2[s2[i - len1].charCodeAt() - 'a'.charCodeAt()]--
if (cnt1.toString() === cnt2.toString()) return true
}
return false
};
// @lc code=end
/*
* @lc app=leetcode.cn id=389 lang=javascript
*
* [389] 找不同
*/
// @lc code=start
/**
* @param {string} s
* @param {string} t
* @return {character}
*/
var findTheDifference = function (s, t) {
const map = new Map()
// 第一遍遍历,将所有字符放进表内
for (let i = 0, len = t.length; i < len; i++) {
let str = t[i]
// 如果字符不存在则初始化该字符value为1
map.set(str, (map.get(str) || 0) + 1)
}
// 第二遍遍历,相同字符value-1,直至为0删除
for (let i = 0, len = s.length; i < len; i++) {
let str = s[i]
// 如果查询到字符,则value-1
if (map.has(str)) map.set(str, map.get(str) - 1)
// 如果该字符的value为0,则移除该字符
if (map.get(str) === 0) map.delete(str)
}
// 剩余最后的字符就是目标值
return [...map.keys()].pop()
};
// @lc code=end
/*
* @lc app=leetcode.cn id=350 lang=javascript
*
* [350] 两个数组的交集 II
*/
// @lc code=start
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
// 原理与389找不同类似
var intersect = function (nums1, nums2) {
let map = new Map()
let ans = []
for (let i = 0, len = nums1.length; i < len; i++) {
let str = nums1[i]
map.set(str, (map.get(str) || 0) + 1)
}
for (let i = 0, len = nums2.length; i < len; i++) {
let str = nums2[i]
if (map.has(str)) {
// 查找交集字符存在,则把当前字符存入ans,并将map中该字符的数量-1
ans.push(str)
map.set(str, map.get(str) - 1)
}
if (map.get(str) === 0) map.delete(str)
}
return ans
};
// @lc code=end
/*
* @lc app=leetcode.cn id=278 lang=javascript
*
* [278] 第一个错误的版本
*/
// @lc code=start
/**
* Definition for isBadVersion()
*
* @param {integer} version number
* @return {boolean} whether the version is bad
* isBadVersion = function(version) {
* ...
* };
*/
/**
* @param {function} isBadVersion()
* @return {function}
*/
var solution = function (isBadVersion) {
/**
* @param {integer} n Total versions
* @return {integer} The first bad version
*/
return function (n) {
let left = 1,
right = n
while (left < right) { // 循环至左右端点相同
// 防止溢出
let center = Math.floor(left + (right - left) / 2)
if (isBadVersion(center)) {
// 答案在左区间
right = center
} else {
// 答案在右区间
left = center + 1
}
}
// 区间缩为一个点时,即为答案
return left
};
};
// @lc code=end
/*
* @lc app=leetcode.cn id=189 lang=javascript
*
* [189] 旋转数组
*/
// @lc code=start
/**
* @param {number[]} nums
* @param {number} k
* @return {void} Do not return anything, modify nums in-place instead.
*/
var rotate = function (nums, k) {
/*
* nums = "----->-->"; k =3
* result = "-->----->";
* reverse "----->-->" we can get "<--<-----"
* reverse "<--" we can get "--><-----"
* reverse "<-----" we can get "-->----->"
*/
let n = nums.length
let pos = k % n
let reverse = function (nums, start, end) {
while (start < end) {
const temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start += 1;
end -= 1;
}
}
reverse(nums, 0, n - 1)
reverse(nums, 0, pos - 1)
reverse(nums, pos, n - 1)
};
// @lc code=end
/*
* @lc app=leetcode.cn id=69 lang=javascript
*
* [69] x 的平方根
*/
// @lc code=start
/**
* @param {number} x
* @return {number}
*/
var mySqrt = function (x) {
// 二分查找
// 左边界
let left = 0
// 右边界
let right = x
// 结果
let ans = -1
while (left <= right) {
// x >> 1 表示 x除2并向下取整
let mid = left + ((right - left) >> 1)
if (mid * mid <= x) {
ans = mid
left = mid + 1
} else {
right = mid - 1
}
}
return ans
};
// @lc code=end
/*
* @lc app=leetcode.cn id=50 lang=javascript
*
* [50] Pow(x, n)
*/
// @lc code=start
/**
* @param {number} x
* @param {number} n
* @return {number}
*/
// 快速幂方式
var myPow = function (x, n) {
// 如果指数为0 返回1
if (n === 0) return 1
// 如果指数为1 返回x
if (n === 1) return x
// 对指数取绝对值,按照正数来做运算
let abs = Math.abs(n)
// 确定指数是否为负
let isMinus = abs !== n
// 当指数为偶数时 底数平方 指数*2。否则整体乘x 底数-1
let res = abs % 2 === 0 ? myPow(x * x, abs / 2) : x * myPow(x, abs - 1)
// 指数为负时,返回结果的倒数
return isMinus ? 1 / res : res
};
// @lc code=end
/*
* @lc app=leetcode.cn id=35 lang=javascript
*
* [35] 搜索插入位置
*/
// @lc code=start
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function (nums, target) {
// 左右指针
let left = 0,
right = nums.length - 1,
ans = nums.length
// 中心
while (left <= right) {
let center = ((right - left) >> 1) + left
// 防止计算溢出
if (target > nums[center]) {
left = center + 1
} else {
right = center - 1
ans = center
}
}
return ans
};
// @lc code=end