JS | 教练,我想做习题15

🚀 前言

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

本系列文章旨在通过练习来提高JavaScript的能力,一起愉快的做题吧。😀😀😀

以下每道题,二毛我都有尝试做一遍。建议限时训练,比如限定为半小时,如果半小时内想不出来,可以结合文章末尾的参考答案来思考。

可以在下方评论区留言或者加我的微信:code_maomao。期待你的到来。

求关注求点赞👍~~~😘😘😘

📖 题目1:对数字求和并求反,看看会发生什么

数字45是具有此有趣属性的第一个整数:数字和它颠倒的数字总和可被它们之间的差(绝对值)整除。

45 + 54 = 99 
abs(45 - 54) = 9
99 is divisible by 9.

此特殊顺序的第一项是:

n        a(n)
1        45
2        54
3        495
4        594

制作函数sum_dif_rev()(JavaScript和CoffeeScript中的sumDivRef),该函数接收n项的序数,并可以为我们提供序列项的值。

sumDifRev(n) -----> a(n)

让我们看一些情况:

sumDifRev(1) -----> 45
sumDifRev(3) -----> 495

“重要提示:请勿包括在反转时具有前导零的数字,例如:1890反转为0981,因此不应包括1890。”

习题代码:

function sumDifRev(n){
  // Good Luck!
}

📖 题目2:最大的回文产品

一个回文数是一个数字,其数字是按照相同的顺序读出前向和后向时。

例如,11、33、1331和98389均为回文数。

编写一个函数,当给定上下两个整数时,返回最大回文数,该数是下限值和上限值之间的任意两个整数的乘积。

例如,如果lower = 10,upper = 99,则可以由该范围内的两个整数组成的最大回文乘积为:99 * 91 = 9009。

请记住,您可以两次使用相同的数字,并且范围包括在内。因此,对于下限= 1和上限= 11,最大回文数将为11 * 11 = 121。

单个数字始终算作回文。

如果无法生产回文产品,请返回NaN。

不会给您无效的参数,因此您可能会依赖一个事实,即upper和lower始终是有效的整数。

上限将始终大于下限,上限和下限都将永远不会小于1或大于999999。

该选项主要是关于优化。幼稚的解决方案将超时,因此您必须找到避免不必要或多余计算的方法。

习题代码:

function largestPalindromicProduct(lower, upper) {
  // in girum imus nocte ecce et consumimur igni
}

答案

🍗 题目1的答案

参考答案1:

var sumDifRev = (() => {
    var buf = [45,54,495,594];
    return n => {
        var i = buf[buf.length-1], j, d;
        while (buf.length<n)
            j = +[...++i+''].reverse().join(''), d = Math.abs(i-j),
            i%10 && d && !((i+j)%d) && buf.push(i);
        return buf[n-1];
    };
})();

参考答案2:

var mem=[]

function sumDifRev(n){
  var r, b, i=44;
  while (mem.length<65) if ((++i+(r=+[...(b=i+"")].reverse().join('')))%Math.abs(i-r)==0&&(r+"").length==b.length) mem.push(i);
  return mem[n-1]
}

参考答案3:

List = [1, 45, 54, 495, 594, 4356, 4545, 4995, 5454, 5895, 5985, 5994, 6534, 19602, 20691, 29403, 30492, 39204, 40293, 43956, 45045, 49005, 49995, 50094, 54054, 59994, 65934, 68607, 70686, 77319, 91377, 197802, 208791, 296703, 307692, 395604, 406593, 439956, 450045, 454545, 494505, 495495, 499995, 505494, 524475, 528255, 536445, 540054, 544455, 544635, 545454, 552825, 554445, 560439, 574425, 593406, 594594, 599994, 604395, 659934, 692307, 703296, 791208, 802197, 890109, 901098]
function sumDifRev(n){
  return List[n];
}

参考答案4:

function sumDifRev(n) {
  // Good Luck!
  if(n==0)return 0;
  let count = 0;
  let a = 11;
  while (count != n) {
    let text = a.toString();
    if (text[text.length - 1] == 9) a++;
    a++;
    let temp = a.toString();
    let b = parseInt(a.toString().split('').reverse().join(''));
    if ((a + b) % Math.abs(b - a) == 0) {
      count++;
    }
  }
  return a;
}

参考答案5:

const data = [45,54,495,594,4356,4545,4995,5454,5895,5985,5994,6534,19602,20691,29403,30492,39204,40293,43956,45045,49005,49995,50094,54054,59994,65934,68607,70686,77319,91377,197802,208791,296703,307692,395604,406593,439956,450045,454545,494505,495495,499995,505494,524475,528255,536445,540054,544455,544635,545454,552825,554445,560439,574425,593406,594594,599994,604395,659934,692307,703296,791208,802197,890109,901098,934065];
const sumDifRev=n=>data[n-1];

🍗 题目2的答案

参考答案1:

function largestPalindromicProduct(l, u) {
  let max = 0
  let mm = 0
  for(let i = u; i >= ~~(u / 2); i--){
    if(i < mm)break
    for(let j = i; j >= l; j--){
      let check = i * j
      if(check < max)break
      if(ifPalin('' + check)){
        max = check
        mm = j
      }
    }
  }
  return max == 0 ? NaN : max
}

function ifPalin(a){
  let l = ~~(a.length/2)
  let ll = a.length - 1
  for(let i = 0; i < l; i++){
    if(a[i] !== a[ll-i])return false
  }
  return true
}

参考答案2:

const largestPalindromicProduct = (lower, upper) => {
  let largestPalindrome = NaN
  for (let i = upper; i >= lower; i--) {
    for (let j = upper; j >= i; j--) {
      const product = i * j
      if (!isNaN(largestPalindrome) && largestPalindrome > product) break
      const productString = `${product}`
      if (productString === [...productString].reverse().join('')) {
        largestPalindrome = isNaN(largestPalindrome) ?
          product :
          Math.max(product, largestPalindrome)
      }
    }
  }
  
  return largestPalindrome
}

参考答案3:

function largestPalindromicProduct(lower, upper) {
  let max = -1
  for (let a = upper; a >= lower; a--) {
    for (let b = upper; b >= a; b--) {
      let p = a * b 
      if (p <= max) break;
      if (isPalindrome(p)) max = p 
    }
  }
  return max > 0 ? max : NaN
}

function isPalindrome(n) {
  return +n.toString().split('').reverse().join('') === n
}

参考答案4:

const isStringPalindrome = s => s === s.split('').reverse().join('')

const isPalindrome = n => n % 10 !== 0 && isStringPalindrome(n.toString(10));

const largestPalindromicProduct = (lower, upper) => {
  let maxProd = NaN;

  // n is how much we subtract from upper for i and j together
  for (let n = 0; n <= upper - lower; n++) {
    const maxD = Math.floor(n / 2);

    if (Math.sqrt(maxProd) > upper - maxD) break;

    // d is how much we subtract from upper to get i
    // i = upper - d; j = upper - (n - d)
    for (let d = maxD; d >= 0; d--) {
      const prod = (upper - d) * (upper - n + d);

      if (maxProd && maxProd > prod) break;

      if (isPalindrome(prod)) maxProd = prod;
    }
  }

  return maxProd;
};

参考答案5:

function largestPalindromicProduct(lower, upper) {
  // in girum imus nocte ecce et consumimur igni
  let isPalindrome = number => (number + '' === (number + '').split('').reverse().join('')) ? true : false;
  let max_palindrome = 0;
  for (let i = upper; i >= lower ; i--){
    if (max_palindrome >= i * upper) return max_palindrome;
    // si ya tengo un MaxPalindrome, pregunto si el producto entre el numero que empieza el bucle actual es mayor al MaxPalindromo, 
    //si no lo es, ya no tengo para que seguir buscando otro palindromo, porque todos seran menores al que ya tengo guardado en max_palindrome
    for (let j = upper; j >= i; j--){
      let product = i * j;
      if (product > max_palindrome){
        if (isPalindrome(product)) {
          max_palindrome = i * j;
        }
      }
    }
  }  
  max_palindrome = max_palindrome === 0 ? NaN : max_palindrome;
  return max_palindrome;
}

🍁后序

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

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

可以关注我的公众号:前端毛小悠。欢迎阅读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值