如何在不使用循环或递归的情况下找到下一个正大的回文?

时间:2017-12-17 14:33:01

标签: javascript

我需要找到下一个更大的更大的回文,但我不允许使用循环或递归。

例如:

getNext(1002); //return 1111

我还能找到它吗?

2 个答案:

答案 0 :(得分:3)

所以,想一想。你有一个特定的案例,你的回文是一个数字。数字很​​容易上班。如果你有1002,你可以取第一个n / 2数字并反转它,所以:10_01,这个较小,所以你在第一个中添加一个:<?php $items = $rma->getItemCollection(); $item = array_slice($items, 0, 3); foreach($item as $itm): ?> <li class="order-row-item"> <div class="order-row-product"> <div class="order-row-product-image"> <img src="<?php echo $this->helper('catalog/image')->init($itm->getProduct(), 'thumbnail')->resize(85) ?>" border="0" /> </div> <div class="order-row-product-name"> <?php echo substr(Mage::helper('rma')->getOrderItemLabel($itm), 0, 30) ?> </div> </div> </li> <?php endforeach;?> 。这为您提供了下一个的基础。所以,你反过来并得到:10 + 1 = 11

这是一个简单的算法,所以代码随你而来。

修改

我认为很明显,但最好说。如果数字具有奇数位数,则中心数字将相同或相同加一。无论如何,我认为你有这个主意。

答案 1 :(得分:2)

这是我在法比亚诺算法的帮助下实现的这项任务的解决方案。我知道它不可读但它确实有效)

function getNextPalindrome(number) {
  let result;
  let nextNum = String(number + 1);
  let leftSide;
  let middle;
  let rightSide;
  let divider = Math.floor(Number(nextNum.length / 2));
  let amountOfNumbers = middle = nextNum.split('');

  if (number < 10) {
    result = 11;
  } else if (amountOfNumbers.length % 2 === 0) {
    leftSide = nextNum.slice(0, divider);
    rightSide = leftSide.split('').reverse().join('');
    result = Number(leftSide + rightSide);
    if (result < nextNum) {
      leftSide = String(Number(nextNum.slice(0, divider)) + 1);
      rightSide = leftSide.split('').reverse().join('');
      result = Number(leftSide + rightSide);
    }
  } else if (amountOfNumbers.length % 2 !== 0) {
    leftSide = nextNum.slice(0, divider);
    middle = Number(middle[Math.floor(middle.length / 2)]);
    rightSide = leftSide.split('').reverse().join('');
    result = Number(leftSide + middle + rightSide);
    if (result < nextNum) {
      middle = middle + 1;
      if (middle === 10) {
        middle = 0;
        leftSide = String(Number(nextNum.slice(0, divider)) + 1);
        rightSide = leftSide.split('').reverse().join('');
        result = Number(leftSide + middle + rightSide);
      } else {
        leftSide = String(Number(nextNum.slice(0, divider)));
        rightSide = leftSide.split('').reverse().join('');
        result = Number(leftSide + middle + rightSide);
      }
    }
  }

  return result;
}