前端算法小白日刷三题17
青训营还差几道题,今天将它做完,接下来应该要休息两周复习期末了,还有个前端大屏的项目,可能每天还会做一题这样
今日第一题:红包运气排行榜
-
创建一个数组来存储每个人的信息,包括他们的名字和抢到的金额
-
根据抢到的金额进行排序,如果金额相同则按照抢红包的顺序进行排序
function solution(n, s, x) {
// 确保 n 等于 s 和 x 的长度
if (n !== s.length || n !== x.length) {
throw new Error("Input lengths do not match");
}
// 创建一个对象来存储每个名字的抢红包金额和原始索引
let start = {};
let cnt = {};
for (let i = 0; i < n; i++) {
if (!(s[i] in start)) {
start[s[i]] = i;
}
cnt[s[i]] = (cnt[s[i]] || 0) + x[i];
}
// 对名字进行排序,排序规则是先按金额降序,金额相同则按原始索引升序
let sortedNames = Object.keys(cnt).sort((a, b) => {
if (cnt[b] === cnt[a]) {
return start[a] - start[b];
}
return cnt[b] - cnt[a];
});
return sortedNames;
}
// 测试用例
function main() {
console.log(JSON.stringify(solution(4, ["a", "b", "c", "d"], [1, 2, 2, 1])) === JSON.stringify(['b', 'c', 'a', 'd']));
console.log(JSON.stringify(solution(3, ["x", "y", "z"], [100, 200, 200])) === JSON.stringify(['y', 'z', 'x']));
console.log(JSON.stringify(solution(5, ["m", "n", "o", "p", "q"], [50, 50, 30, 30, 20])) === JSON.stringify(['m', 'n', 'o', 'p', 'q']));
}
main();
今日第二题:数组元素之和最小化
function solution(n, k) {
// write code here
let num=0
for(let i=1;i<=n;i++){
num+=k*i
}
return num;
}
function main() {
console.log(solution(3, 1) === 6);
console.log(solution(2, 2) === 6);
console.log(solution(4, 3) === 30);
}
main();
- 这题虽然中等难度,但比上一题简单很多
最后一题:最少字符串操作次数
function solution(S) {
// write code here
if (!S) return 0
let num = 0
const map = new Map()
for (let val of S) {
if (map.has(val)) {
map.set(val, map.get(val) + 1)
} else {
map.set(val, 1)
}
}
for (let [val, num1] of map) {
if (num1 == 1) {
num+=0
} else {
num += Math.floor(num1 / 2)
}
}
return num;
}
function main() {
console.log(solution("abab") === 2);
console.log(solution("aaaa") === 2);
console.log(solution("abcabc") === 3);
}
main();