乐趣区

关于javascript: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;
}

???? 后序

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

求关注求点赞 ????~~????????????

能够关注我的公众号: 前端毛小悠 。欢送浏览

退出移动版