leetcode刷题记录(38)-简单

这篇博客记录了作者在LeetCode上完成的五道编程题,包括:判断一周中的第几天、求气球的最大数量、检查独一无二的出现次数、找出数组中最小绝对差的元素对以及玩筹码问题。每道题都给出了解题思路。
摘要由CSDN通过智能技术生成

1.一周中的第几天

给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。

输入为三个整数:day、month 和 year,分别表示日、月、年。

您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}。

思路:用Date对象的getDay()方法

/**
 * @param {number} day
 * @param {number} month
 * @param {number} year
 * @return {string}
 */
var dayOfTheWeek = function(day, month, year) {
    const a = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
    return a[new Date(`${year}-${month}-${day}`).getDay()]
};

2.气球的最大数量

题目:

给你一个字符串 text,你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"(气球)。

字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。

思路:先统计text中每个字符的出现次数,然后分别除以balloon各字符的出现次数,向下取整取最小值

/**
 * @param {string} text
 * @return {number}
 */
var maxNumberOfBalloons = function(text) {
  const map = new Map();
  for (const s of text) {
    map.set(s, (map.get(s) || 0) + 1);
  }
  let b = 0;
  let a = 0;
  let l = 0;
  let o = 0;
  let n = 0;
  b = map.get("b") || 0;
  a = map.get("a") || 0;
  l = ~~((map.get("l") || 0) / 2);
  o = ~~((map.get("o") || 0) / 2);
  n = map.get("n") || 0;
  return Math.min(a, b, l, o, n);
};

3.独一无二的出现次数

题目:

给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。

如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false

思路:统计每个数字的出现次数,然后将出现次数的大小和set之后的大小比较


/**
 * @param {number[]} arr
 * @return {boolean}
 */
var uniqueOccurrences = function(arr) {
  const map = new Map();
  for (const n of arr) {
    map.set(n, (map.get(n) || 0) + 1);
  }
  return map.size === new Set([...map.values()]).size;
};

4.最小绝对差

题目:

给你个整数数组 arr,其中每个元素都 不相同

请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回。

思路:对数组进行排序,相邻的元素肯定是相差最小的。然后记录相邻两个数的差,每次最小差更新时,清空数组,并记录新数的对

/**
 * @param {number[]} arr
 * @return {number[][]}
 */
var minimumAbsDifference = function(arr) {
  arr.sort((a, b) => a - b);
  const l = arr.length;
  const res = [];
  let min = Infinity;
  for (let i = 0; i < l - 1; i++) {
    if (arr[i + 1] - arr[i] < min) {
      res.splice(0, Infinity, [arr[i], arr[i + 1]]);
      min=arr[i + 1] - arr[i]
    } else if (arr[i + 1] - arr[i] == min) {
      res.push([arr[i], arr[i + 1]]);
    }
  }
  return res;
};

5.玩筹码

题目:

数轴上放置了一些筹码,每个筹码的位置存在数组 chips 当中。

你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以):

将第 i 个筹码向左或者右移动 2 个单位,代价为 0。
将第 i 个筹码向左或者右移动 1 个单位,代价为 1。
最开始的时候,同一位置上也可能放着两个或者更多的筹码。

返回将所有筹码移动到同一位置(任意位置)上所需要的最小代价。

思路:因为移动两个位置代价为0,移动一个位置代价为1,所以假设x个在偶数下标,y个在奇数下标,结果要么是x要么是y,取较小值即可

/**
 * @param {number[]} position
 * @return {number}
 */
var minCostToMoveChips = function(position) {
  let e = 0;
  for (const i of position) {
    if (i % 2) {
      e++;
    }
  }
  return e>position.length/2?position.length-e:e
};
/**
 * @param {number[]} position
 * @return {number}
 */
var minCostToMoveChips = function(position) {
  let e = 0,
    o = 0;
  for (const i of position) {
    if (i % 2) {
      o++;
    } else {
      e++;
    }
  }
  return Math.min(e, o);
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值