博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Largest Palindrome Product 最大回文串乘积
阅读量:6263 次
发布时间:2019-06-22

本文共 1196 字,大约阅读时间需要 3 分钟。

 

Find the largest palindrome made from the product of two n-digit numbers.

Since the result could be very large, you should return the largest palindrome mod 1337.

Example:

Input: 2

Output: 987

Explanation: 99 x 91 = 9009, 9009 % 1337 = 987

 

Note:

The range of n is [1,8].

 

这道题给我们一个数字n,问两个n位数的乘积组成的最大回文数是多少,返回的结果对1337取余。博主刚开始用暴力搜索做,遍历所有的数字组合,求乘积,再来判断是否是回文数,最终TLE了,只能换一种思路来做。论坛上的这种思路真心叼啊,博主感觉这题绝比不该Easy啊。首先我们还是要确定出n位数的范围,最大值upper,可以取到,最小值lower,不能取到。然后我们遍历这区间的所有数字,对于每个遍历到的数字,我们用当前数字当作回文数的前半段,将其翻转一下拼接到后面,此时组成一个回文数,这里用到了一个规律,当n>1时,两个n位数乘积的最大回文数一定是2n位的。下面我们就要来验证这个回文数能否由两个n位数相乘的来,我们还是遍历区间中的数,从upper开始遍历,但此时结束位置不是lower,而是当前数的平方大于回文数,因为我们遍历的是相乘得到回文数的两个数中的较大数,一旦超过这个范围,就变成较小数了,就重复计算了。比如对于回文数9009,其是由99和91组成的,其较大数的范围是[99,95],所以当遍历到94时,另一个数至少需要是95,而这种情况在之前已经验证过了。当回文数能整除较大数时,说明是成立的,直接对1337取余返回即可,参见代码如下:

 

class Solution {public:    int largestPalindrome(int n) {        int upper = pow(10, n) - 1, lower = upper / 10;        for (int i = upper; i > lower; --i) {            string t = to_string(i);            long p = stol(t + string(t.rbegin(), t.rend()));            for (long j = upper; j * j > p; --j) {                if (p % j == 0) return p % 1337;            }        }        return 9;    }};

 

参考资料:

 

转载地址:http://bvzpa.baihongyu.com/

你可能感兴趣的文章
阿里云开发者工具上手体验
查看>>
前端模块化详解(完整版)
查看>>
CSS 从入门到放弃系列:CSS的引入方式
查看>>
策略模式原来这么简单!
查看>>
js中 split slice splice 的区分
查看>>
阿里云运维总结
查看>>
js实用方法记录-js动态加载css、js脚本文件
查看>>
微信小程序入门: 导航栏样式、tabBar导航栏
查看>>
Runtime整理(二)——Runtime包含的所有函数
查看>>
nodejs request模块用法
查看>>
使用webpack从0搭建多入口网站脚手架,可复用导航栏/底部通栏/侧边栏,根据页面文件自动更改配置,支持ES6/Less...
查看>>
消息未读之点不完的小红点(Node+Websocket)
查看>>
JavaScript 之 DOM [ Node对象 ]
查看>>
使用vscode写typescript(node.js环境)起手式
查看>>
飞天技术汇大视频专场:全民视频时代下的创新技术之路
查看>>
以太坊分片详解
查看>>
Redis安装以及PHP开启Redis扩展
查看>>
JAVA IO BIO NIO AIO
查看>>
使用iview的组件 Table 表格,有固定列,设置其中一个列适应屏幕大小
查看>>
Vue学习笔记1
查看>>