做了几个简单算法题

117 阅读1分钟
 * @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