最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JS | 教练,我想做习题8

    正文概述 掘金(毛小悠)   2021-02-04   553

    ? 前言

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

    本系列文章旨在通过练习来提高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 | 教练,我想做习题8


    起源地下载网 » JS | 教练,我想做习题8

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元