共计 4545 个字符,预计需要花费 12 分钟才能阅读完成。
???? 前言
大家好呀,我是毛小悠,能够叫我二毛,在家中排行老二,是一名前端开发工程师。
本系列文章旨在通过练习来进步 JavaScript 的能力,一起欢快的做题吧。????????????
以下每道题,二毛我都有尝试做一遍。倡议限时训练,比方限定为半小时,如果半小时内想不进去,能够联合文章开端的参考答案来思考。
求关注求点赞 ????\~~~????????????
???? 题目 1:N 的尾随零数!
编写一个程序,该程序将计算给定数阶乘中的尾随零数。
N!\= 1 * 2 * 3 * … * N
小心 1000!有 2568 位数字 …
无关更多信息,请参见:http : //mathworld.wolfram.com/Factorial.html
例子
zeros(6) = 1
# 6! = 1 * 2 * 3 * 4 * 5 * 6 = 720 --> 1 trailing zero
zeros(12) = 2
# 12! = 479001600 --> 2 trailing zeros
提醒:您并不需要计算阶乘。寻找另一种办法来找到零的数量。
习题代码
function zeros (n) {// your code here}
???? 题目 2:整数:娱乐一
42 的除数是:1、2、3、6、7、14、21、42。这些除数的平方是:1、4、9、36、49、196、441、1764。平方除数的总和是 2500,这是 50 * 50,一个正方形!
给定两个整数 m,n(1 <= m <= n),咱们心愿找到 m 和 n 之间的所有整数,它们的平方除数之和自身就是一个平方。42 就是这样一个数字。
后果将是一个数组或元组的数组(在 C 中为 Pair 的数组)或一个字符串,每个子数组都有两个元素,第一个元素是平方除数为平方的数字,而后是平方除数的总和。
例子:
list_squared(1, 250) --> [[1, 1], [42, 2500], [246, 84100]]
list_squared(42, 250) --> [[42, 2500], [246, 84100]]
习题代码
function listSquared(m, n) {// your code}
???? 题目 3:双可乐
Sheldon,Leonard,Penny,Rajesh 和 Howard 正在自动售货机排队购买“Double Cola”饮料。队列中没有其他人。队列中的第一个(Sheldon)买了一个罐子,喝下后加倍!由此产生的两个谢尔顿进入队列的末端。而后,队列中的下一个(Leonard)买了一个罐头,喝了一下,而后作为两个 Leonards 达到队列的末端,依此类推。
例如,Penny 喝了第三罐可乐,队列如下所示:
Rajesh, Howard, Sheldon, Sheldon, Leonard, Leonard, Penny, Penny
编写一个程序,该程序将返回将喝第 n 可乐的人的名字。
输出:
输出数据由一个至多蕴含 1 个名称的数组和一个整数 n 组成,该整数可能与您抉择的语言反对的最大数字一样高(当然,如果有这样的限度)。
输入 / 示例:
返回单行 - 喝第 n 罐可乐的人的名字。罐从 1 开始编号。
whoIsNext(["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"], 1) == "Sheldon"
whoIsNext(["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"], 52) == "Penny"
whoIsNext(["Sheldon", "Leonard", "Penny", "Rajesh", "Howard"], 7230702951) == "Leonard"
习题代码:
function whoIsNext(names, r){//your code here}
答案
???? 题目 1 的答案
参考答案 1:
function zeros (n) {
var zs = 0;
while(n>0){n=Math.floor(n/5);
zs+=n
}
return zs;
}
参考答案 2:
function zeros(n) {return n/5 < 1 ? 0 : Math.floor(n/5) + zeros(n/5);
}
参考答案 3:
function zeros (n) {
var res = 0;
for(var i=5; i<n; i*=5)
res += Math.floor(n/i);
return res;
}
参考答案 4:
function zeros(n){ //trailing zeroes of n!
var countfives = 0,
pow5 = 1,
occurances;
while(pow5 *= 5, occurances = Math.floor(n/pow5)) countfives += occurances;
return countfives;
}
参考答案 5:
function zeros (n) {n = ~~(n/5);
return n + (n<5 ? 0 : zeros(n));
}
???? 题目 2 的答案
参考答案 1:
function listSquared (m, n) {var matches = [];
for (var i = m; i <= n; ++i) {var sum = getDivisors(i).reduce((sum, n) => sum + n * n, 0);
var ok = Number.isInteger(Math.sqrt(sum));
if (ok) {matches.push([i, sum]);
}
}
return matches;
}
function getDivisors (n) {var divisors = [];
for (var i = 1; i <= n / 2; ++i) {if (n % i) {continue;}
divisors.push(i);
}
return divisors.concat([n]);
}
参考答案 2:
function listSquared(m, n) {var arr = [];
for (var i = m; i <= n; i++){
var temp = 0;
for (var j = 1; j <= i; j++) {if ( i % j == 0) temp += j*j;
};
if (Math.sqrt(temp) % 1 == 0) arr.push([i, temp]);
};
return arr;
}
参考答案 3:
const cache = new Map();
const square = x => x * x;
const sum = (x, y) => x + y
const isSquareDivisor = (x) => Math.sqrt(x) % 1 === 0;
const findDivisors = n => {if (cache.has(n)) return cache.get(n);
const divisors = n === 1 ? [1] : [1, n];
for (let i = 2; i < n; i++) {if (n % i === 0)
divisors.push(i);
}
cache.set(n, divisors);
return divisors;
}
function listSquared(m, n) {const results = [];
for (let i=m; i <=n; i++) {const divisors = findDivisors(i)
const squared = divisors.map(square)
const summed = squared.reduce(sum, 0)
if (isSquareDivisor(summed)) {results.push([i, summed])
}
}
return results;
}
参考答案 4:
function listSquared(m,n){let chamber = {};
function wuTang(x){let i = 1, odb = [], meth;
while (i <= x){!(x % i) ? (odb.push(i),i++) : i++}
meth = odb.reduce((a,e) => (chamber[e] ? chamber[e] : (chamber[e] = e * e, chamber[e])) + a,0);
return !(Math.sqrt(meth) % 1) ? [--i,meth] : null;
}
return Array.from({length:(n - m)},(e,i) => wuTang(i + m)).filter(e => e);
}
参考答案 5:
const c = [[1,1],[42,2500],[246,84100],[287,84100],[728,722500],[1434,2856100],[1673,2856100],[1880,4884100],[4264,24304900],[6237,45024100],[9799,96079204],[9855,113635600]];
const listSquared = (a,b) => c.filter(([d]) => d>=a && d<=b);
???? 题目 3 的答案
思路:队列的前一个元素会变为 2 个元素插入到队列尾部。
参考答案 1:
function whoIsNext(names, r) {
var l = names.length;
while (r >= l) {r -= l; l *= 2;}
return names[Math.ceil(names.length * r / l)-1];
}
参考答案 2:
function whoIsNext(names, r){
var numOfGeeks = names.length;
var loga = Math.log((r/numOfGeeks)+1) / Math.log(2);
var completeCycles = Math.floor(loga)
var fullCycleColas = (Math.pow(2,completeCycles)-1) * numOfGeeks;
var currCycleSize = Math.pow(2,completeCycles) * numOfGeeks;
var geekCode = Math.ceil((r - fullCycleColas)/currCycleSize * numOfGeeks);
return names[geekCode-1]
}
参考答案 3:
function whoIsNext(names, r) {
var peopleInLine = names.length;
var copiesOfEachPerson = 1;
while (r > peopleInLine) {
r -= peopleInLine;
copiesOfEachPerson *= 2;
peopleInLine *= 2;
}
return names[Math.floor((r - 1) / copiesOfEachPerson) % peopleInLine];
}
参考答案 4:
function whoIsNext(names, n){
x=names.length;
i=1;
while (n > x){
n -= x;
x *= 2;
i *= 2;
}
return (names[parseInt((n - 1)/i)]);
}
参考答案 5:
function whoIsNext(names, r){
var l = names.length, ini = l;
while(r > ini) {
r -= ini;
ini *= 2;
}
return names[Math.ceil(r * l / ini) - 1];
}
???? 后序
本系列会定期更新的,题目会由浅到深的逐步提高。
求关注求点赞 ????~~????????????
能够关注我的公众号: 前端毛小悠 。欢送浏览