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