🚀 前言
大家好呀,我是毛小悠,可以叫我二毛,在家中排行老二,是一名前端开发工程师。
本系列文章旨在通过练习来提高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;
}
🍁后序
本系列会定期更新的,题目会由浅到深的逐步提高。
求关注求点赞 👍~~🍭🍭🍭
可以关注我的公众号:前端毛小悠。欢迎阅读