Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * @param {string} n
- * @return {string}
- */
- var reverseStr = function(str) {
- var rStr = '';
- for (var i = str.length - 1; i >= 0; i--) {
- rStr = rStr + str[i];
- }
- return rStr;
- };
- var getDistance = function(a,b) {
- /*var difflength = a.length - b.length;
- difflength = difflength < 0 ? -1*difflength : difflength;
- if (difflength > 0) {
- var zero = '';
- for (var i = 0; i < difflength; i++) {
- zero = zero + '0';
- }
- if (a.length > b.length) {
- b = zero + b;
- } else {
- a = zero + a;
- }
- }
- var str = '';
- for (var i = 0; i < a.length; i++) {
- var dif = parseInt(a[i]) - parseInt(b[i]);
- dif = dif < 0 ? -1*dif : dif;
- str = str + dif;
- }*/
- return parseInt(a) > parseInt(b) ? a - b : b - a;
- };
- var getPalin = function(firstHalf) {
- reverseHalf = reverseStr(firstHalf);
- return firstHalf + reverseHalf;
- }
- var updateSolution = function(distance, palin, solution) {
- if (distance < solution.min_dis) {
- solution.palin = palin;
- solution.min_dis = distance;
- } else if (distance === solution.min_dis && parseInt(palin) < parseInt(solution.palin)) {
- solution.palin = palin;
- }
- }
- var updateOdd = function(firstHalf, solution, n) {
- var reverseHalf = reverseStr(firstHalf);
- for (var i = 0; i < 10; i++) {
- var palin = firstHalf + i + reverseHalf;
- if (palin !== n) {
- updateSolution(getDistance(palin, n), palin, solution);
- }
- }
- }
- var nearestPalindromic = function(n) {
- var solution = {};
- solution.min_dis = Math.pow(10,18);
- solution.palin = '';
- var firstHalf;
- var palin;
- if (parseInt(n) <= 10) {
- return (n - 1).toString();
- }
- if (n.length % 2 === 0) {
- half = n.length/2;
- firstHalf = n.slice(0, half);
- palin = getPalin(firstHalf);
- if (palin !== n) {
- updateSolution(getDistance(palin, n), palin, solution);
- }
- // plus 1
- firstHalf = (parseInt(n.slice(0, half)) + 1).toString();
- if (firstHalf.length !== half) { // 0
- // go with odd number
- updateOdd(firstHalf.slice(0, firstHalf.length - 1), solution, n);
- } else {
- palin = getPalin(firstHalf);
- updateSolution(getDistance(palin, n), palin, solution);
- }
- // minus 1
- firstHalf = (parseInt(n.slice(0, half)) - 1).toString();
- if (firstHalf === '0') {
- updateSolution(getDistance('9', n), '9', solution);
- }
- if (firstHalf.length !== half) { // 0
- // go with odd number
- updateOdd(firstHalf, solution, n);
- } else {
- palin = getPalin(firstHalf);
- updateSolution(getDistance(palin, n), palin, solution);
- }
- } else {
- half = (n.length - 1)/2;
- firstHalf = n.slice(0, half);
- updateOdd(firstHalf, solution, n);
- if (firstHalf[firstHalf.length - 1] === '0') { // go with even
- firstHalf = (parseInt(n.slice(0, half + 1)) - 1).toString();
- palin = getPalin(firstHalf);
- updateSolution(getDistance(palin, n), palin, solution);
- }
- // plus 1
- firstHalf = (parseInt(n.slice(0, half)) + 1).toString();
- if (firstHalf.length !== half) { // 0
- // go with even number
- palin = getPalin(firstHalf);
- updateSolution(getDistance(palin, n), palin, solution);
- } else {
- updateOdd(firstHalf, solution, n);
- }
- // minus 1
- firstHalf = (parseInt(n.slice(0, half)) - 1).toString();
- if (firstHalf[firstHalf.length - 1] === '0') { // go with even
- firstHalf = (parseInt(n.slice(0, half + 1)) - 1).toString();
- palin = getPalin(firstHalf);
- updateSolution(getDistance(palin, n), palin, solution);
- }
- if (firstHalf.length !== half) { // 0
- // go with even number
- palin = getPalin(firstHalf);
- updateSolution(getDistance(palin, n), palin, solution);
- } else {
- updateOdd(firstHalf, solution, n);
- }
- }
- return solution.palin;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement