leetcode刷题记录(43)-简单

本文记录了LeetCode的五道题目,包括将数字变为0的操作次数、检查整数及其两倍数的存在、统计有序矩阵中的负整数、根据二进制下1的数目排序以及计算日期间隔的解题思路和方法。通过迭代、特殊条件处理、非递增属性利用和排序策略,对问题进行了深入解析。
摘要由CSDN通过智能技术生成

1.将数字变成0的操作次数

题目:给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。

思路:迭代

/**
 * @param {number} num
 * @return {number}
 */
var numberOfSteps  = function(num) {
  let c = 0;
  while (num) {
    if (num % 2) {
      num -= 1;
    } else {
      num /= 2;
    }
    c++
  }
  return c;
};

2.检查整数及其两倍数是否存在

题目:

给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。

更正式地,检查是否存在两个下标 i 和 j 满足:

i != j
0 <= i, j < arr.length
arr[i] == 2 * arr[j]

思路:对0单独处理

/**
 * @param {number[]} arr
 * @return {boolean}
 */
var checkIfExist = function(arr) {
  for (const n of arr) {
    if (!n && arr.filter((i) => !i).length == 2) {
      return true;
    } else if (n && arr.includes(2 * n)) {
      return true;
    }
  }
  return false;
};

3.统计有序矩阵中的负整数

题目:

给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。 

请你统计并返回 grid 中 负数 的数目。

思路:因为是非递增的,所以不需要遍历全部成员,遍历每一行,直到遇到该行第一个负数

/**
 * @param {number[][]} grid
 * @return {number}
 */
var countNegatives = function(grid) {
  let c = 0;
  const m = grid.length;
  const n = grid[0].length;
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (grid[i][j] < 0) {
        c += n - j;
        break;
      }
    }
  }
  return c;
};

 4.根据数字二进制下1的数目排序

题目:

给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。

如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。

请你返回排序后的数组。、

思路:用sort方法,为了提高性能,用缓存

/**
 * @param {number[]} arr
 * @return {number[]}
 */
var sortByBits = function(arr) {
  const map = new Map();
  arr.sort((a, b) => {
    const l1 = getL(a);
    const l2 = getL(b);
    if (l1 == l2) return a - b;
    return l1 - l2;
  });
  function getL(a) {
    if (map.get(a)) return map.get(a);
    const l = a
      .toString(2)
      .split("")
      .filter((i) => i == 1).length;
    map.set(a, l);
    return l;
  }
  return arr;
};

5.日期之间隔几天

题目:

请你编写一个程序来计算两个日期之间隔了多少天。

日期以字符串形式给出,格式为 YYYY-MM-DD,如示例所示。

思路:转换成时间戳计算

/**
 * @param {string} date1
 * @param {string} date2
 * @return {number}
 */
var daysBetweenDates = function(date1, date2) {
  const mod = 3600 * 24 * 1000;
  return Math.abs((new Date(date1).getTime() - new Date(date2).getTime()) / mod);
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值