🚀 前言
大家好呀,我是毛小悠,可以叫我二毛,在家中排行老二,是一名前端开发工程师。
本系列文章旨在通过练习来提高JavaScript的能力,一起愉快的做题吧。😀😀😀
以下每道题,二毛我都有尝试做一遍。建议限时训练,比如限定为半小时,如果半小时内想不出来,可以结合文章末尾的参考答案来思考。
求关注求点赞👍~~~😘😘😘
📖 题目1:皮特,面包师
皮特喜欢烤一些蛋糕。他有一些食谱和配料。不幸的是他数学不好。考虑到他的食谱,您能帮助他找出多少个蛋糕可以烘烤?
编写一个函数cakes(),该函数接受recipe (object)和可用成分(也是对象),并返回Pete可以烘烤的最大蛋糕数(整数)。为简单起见,没有数量单位(例如1磅面粉或200克糖只是1或200)。对象中不存在的成分可以视为0。
例子:
// must return 2
cakes({flour: 500, sugar: 200, eggs: 1}, {flour: 1200, sugar: 1200, eggs: 5, milk: 200});
// must return 0
cakes({apples: 3, flour: 300, sugar: 150, milk: 100, oil: 100}, {sugar: 500, flour: 2000, milk: 2000});
习题代码
function cakes(recipe, available) {
// TODO: insert code
}
📖 题目2:Directions Reduction
曾几何时,穿过古老的荒野山区西部,…
指示了一个人从一个点到另一个点的方向。方向为“北”,“南”,“西”,“东”。显然“ NORTH”和“ SOUTH”相反,“ WEST”和“ EAST”也相反。
去一个方向,马上回来向相反的方向是不必要的。由于这是狂野的西部,天气恶劣,水少,重要的是要为自己节省一些能量,否则您可能会口渴而死!
我如何聪明地穿越多山的沙漠。
给该男子的指示例子如下(取决于语言):
["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"].or{ "NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST" };or[North, South, South, East, West, North, West]
您可以立即看到去“北”和然后立即去“南”是不合理的,最好留在原地!因此,任务是给该人员简化计划。在这种情况下,更好的计划是:
["WEST"]or{ "WEST" }or[West]
其他例子:
在那里["NORTH", "SOUTH", "EAST", "WEST"],方向"NORTH" + "SOUTH"是向北并立即回到原点。
路径["EAST", "WEST"]现在变成,"EAST"并且"WEST"彼此抵消,因此最终结果是[](在Clojure中为nil)。
在[“ NORTH”,“ EAST”,“ WEST”,“ SOUTH”,“ WEST”,“ WEST”],“ NORTH”和“ SOUTH”中,不是直接相反的,但是在减少“ EAST”之后它们变成直接相反的和“ WEST”,因此整个路径可简化为[“ WEST”,“ WEST”]。
任务
编写一个函数dirReduc,该函数将接收字符串数组并返回删除了不必要方向的字符串数组(W <-> E或S <-> N并排)。
Haskell版本采用列出方向data Direction = North | East | West | South。
当路径简化为空时,Clojure版本返回nil。
Rust版本需要enum Direction {NORTH, SOUTH, EAST, WEST}。
习题代码
function dirReduc(arr){ // ...}
答案
🍗 题目1的答案
参考答案1:
function cakes(recipe, available) {
return Object.keys(recipe).reduce(function(val, ingredient) {
return Math.min(Math.floor(available[ingredient] / recipe[ingredient] || 0), val)
}, Infinity)
}
参考答案2:
const cakes = (needs, has) => Math.min(
...Object.keys(needs).map(key => Math.floor(has[key] / needs[key] || 0))
)
参考答案3:
function cakes(recipe, available) {
var numCakes = [];
for(var key in recipe){
if(recipe.hasOwnProperty(key)){
if(key in available){
numCakes.push(Math.floor(available[key] / recipe[key]));
}else{
return 0;
}
}
}
return Math.min.apply(null, numCakes);
}
参考答案4:
function cakes(recipe, initial){
return Math.floor(Object.keys(recipe).reduce(function(min, key){
return Math.min(initial[key] / recipe[key] || 0, min);
}, Infinity));
}
参考答案5:
function cakes(recipe, available) {
return Math.min(...Object.keys(recipe).map(e => available[e]/recipe[e]>>0));
}
🍗 题目2的答案
参考答案1:
function dirReduc(plan) {
var opposite = {
'NORTH': 'SOUTH', 'EAST': 'WEST', 'SOUTH': 'NORTH', 'WEST': 'EAST'};
return plan.reduce(function(dirs, dir){
if (dirs[dirs.length - 1] === opposite[dir])
dirs.pop();
else
dirs.push(dir);
return dirs;
}, []);
}
参考答案2:
function dirReduc(arr) {
var str = arr.join(''), pattern = /NORTHSOUTH|EASTWEST|SOUTHNORTH|WESTEAST/;
while (pattern.test(str)) str = str.replace(pattern,'');
return str.match(/(NORTH|SOUTH|EAST|WEST)/g)||[];
}
参考答案3:
function dirReduc(arr){
var opposite = { "SOUTH":"NORTH", "NORTH":"SOUTH", "WEST":"EAST", "EAST":"WEST"}
return arr.reduce(function (a, b, i) {
opposite[a.slice(-1)] === b ? a.pop() : a.push(b)
return a
}, [])
}
参考答案4:
function isOppo(dir1,dir2) {
if (dir1 + dir2 === 'SOUTHNORTH') return true;
if (dir1 + dir2 === 'NORTHSOUTH') return true;
if (dir1 + dir2 === 'EASTWEST') return true;
if (dir1 + dir2 === 'WESTEAST') return true;
return false;
}
function dirReduc(arr){
var len = arr.length
for (var i = 0; i < len - 1; i++) {
if (isOppo(arr[i], arr[i+1])) {
arr.splice(i,2);
return dirReduc(arr);
}
}
return arr;
}
参考答案5:
function dirReduc(arr){
var count = 0;
for (var i = 0; i < arr.length; i++) {
if (arr[i] === "WEST" && arr[i+1] === "EAST" ||
arr[i] === "EAST" && arr[i+1] === "WEST" ||
arr[i] === "NORTH" && arr[i+1] === "SOUTH" ||
arr[i] === "SOUTH" && arr[i+1] === "NORTH") {
arr.splice(i, 2);
count++;
i--;
}
}
return count === 0 ? arr : dirReduc(arr);
}
🍁后序
本系列会定期更新的,题目会由浅到深的逐步提高。
求关注求点赞 👍~~🍭🍭🍭
可以关注我的公众号:前端毛小悠。欢迎阅读
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。