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);
};