【JS】JS | 教练,我想做习题8

JS | 教练,我想做习题8

前端毛小悠发布于 42 分钟前

🚀 前言

大家好呀,我是毛小悠,可以叫我二毛,在家中排行老二,是一名前端开发工程师。

本系列文章旨在通过练习来提高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];

}

🍁后序

本系列会定期更新的,题目会由浅到深的逐步提高。

求关注求点赞 👍~~🍭🍭🍭

可以关注我的公众号:前端毛小悠。欢迎阅读
【JS】JS | 教练,我想做习题8

javascript前端

阅读 21发布于 42 分钟前

本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议

avatar

前端毛小悠

11 声望

4 粉丝

0 条评论

得票时间

avatar

前端毛小悠

11 声望

4 粉丝

宣传栏

🚀 前言

大家好呀,我是毛小悠,可以叫我二毛,在家中排行老二,是一名前端开发工程师。

本系列文章旨在通过练习来提高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];

}

🍁后序

本系列会定期更新的,题目会由浅到深的逐步提高。

求关注求点赞 👍~~🍭🍭🍭

可以关注我的公众号:前端毛小悠。欢迎阅读
【JS】JS | 教练,我想做习题8

以上是 【JS】JS | 教练,我想做习题8 的全部内容, 来源链接: www.h5w3.com/112719.html

回到顶部