第 81 题:打印出 1 - 10000 之间的所有对称数 例如 121、1331 等
[...Array(10000).keys()].filter((x) => { return x.toString().length > 1 && x === Number(x.toString().split('').reverse().join('')) })
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(57)
function a(start, end) {
let arr = []
const endloc = Math.floor(Math.log10(end))
const startloc = Math.floor(Math.log10(start))
const backTrack = function (val, weishu) {
if (val <= end && val >= start && weishu == 0) {
arr.push(val)
return
}else if (weishu == 0 &&( val > end || val < start)) return
if (weishu == 1) {
const number = (10 ** Math.ceil((Math.floor(Math.log10(val)) - 1) / 2))
for (let i = 0; i <= 9; i++) {
backTrack(val + number * i, weishu - 1)
}
} else if (weishu == 2) {
if (Math.floor(Math.log10(val)) == 1) {
for (let i = 0; i <= 9; i++) {
backTrack(11 * i, 0)
}
return
}
const number = (10 ** Math.ceil((Math.floor(Math.log10(val)) - 2) / 2)) * 11
for (let i = 0; i <= 9; i++) {
backTrack(val + number * i, weishu - 2)
}
} else {
let mid
if (Math.floor(Math.log10(val)) + 1 == weishu) {
mid = val + 1
for (let i = 0; i <= 9; i++) {
}
a(22, 100)
回溯
[...Array(10000).keys()].filter(value => value > 10 && value.toString() === value.toString().split('').reverse().join(''))
一个比较原始的办法,但却是最好理解的:
一、遍历所有数,判断是否是回文数
1、字符串反转后判断
2、双指针遍历
二、不遍历所有数,直接找出规律,枚举所有对称数
正则表达式,顺便对比一楼的耗时
这个字符串反转比较应该是用的最多的了吧
function dd(num,list){
while(num>100){
if(num.toString().split('').reverse().join('')==num){
list.push(num)
}
num--
}
return list
}
let res = []
for(var i = 10; i <= 10000; i++) {
res.push(tt(i))
}
console.log('res===',res.filter(i => i))
function tt(str) {
str = str.toString();
var l = str.length;
}
方法一
方法二
笨方法实现
*/
var str = '';
for (var i = 1; i < 10000; i++) {
var digit = Math.floor(i / 10);
if (digit === 0) {
str = str + i + '|';
} else if (digit >= 1 && digit <= 9) {
var ge = i % 10;
var shi = Math.floor(i / 10);
if (ge === shi) {
str = str + i + '|';
}
} else if (digit >= 10 && digit <= 99) {
var ge = i % 10;
var bai = Math.floor(i / 100);
if (ge === bai) {
str = str + i + '|';
}
大家的方法都差不多,ES6还是好用。
读这道题,我首先想到的是,最简单的方法是循环10000次,反转数字前后比较如果相等,则打印。可是循环10000次性能也太差了,怎么才能不循环怎么多次呢?利用对称数
一、循环1000次,笨方法
二、利用对称数
以10000 为例,列出所有位数的对称数,比如1位数的 对称数, 2位数的对称数...到5位数, 再判断是否小于10000。
对称数生成 : 遍历最长位数(如5位)。 每个位置遍历 0 - 9,对称即可。
function getSemmetryNum() {
const semmetryNumList = []
for (let i = 0;i < 3;i++) {
for(let j = 1;j < 10;j++) {
if (i === 0) {
semmetryNumList.push(
${j}${j}
- 0)} else {
for(let k = 0;k < 10; k++) {
let tempNum = new Array(i).fill(k).join('')
semmetryNumList.push(
${j}${tempNum}${j}
- 0)}
}
}
}
return semmetryNumList
}
两头肯定是类似1**1 2*2之类的,中间的数有可能是0位,1位,2位
这个方法可以得到结果,但不够通用
暴力解法
大佬,进行筛选的是下标(0 ~ 9999),不是(1 ~ 10000),如果题目要求时(1~9999)就有问题了,
强答:
1 - 9 应该不能算对称数吧
for (let i = 0; i < 100000; i++) {
if (''.split.call(i, '').reverse().join('') == i) console.log(i)
}
Array.from({length: 10000}, (o, i) => i).filter(o => o + '' === (o + '').split('').reverse().join(''))
自己的以及上面各位总结:
循环10000次 效率在哪?
我的思路:
1、找对称数字 如 AA、ABA、ABBA 因为是10000以内,所以只有这三种情况
2、0不能当做首位
欢迎交流
暴力方法
function find() {
let result = [];
for(let i=1;i<10000;i++){
let str = i.toString();
let isToAdd = true;
for(let j in str){
if(str[j] != str[str.length -1 -j]){
isToAdd = false;
}
}
if(isToAdd &&str.length>1){
result.push(i);
}
}
console.log(result);
return result;
}
find();
function f(num) {
return num.toString() === num.toString().split('').reverse().join('')
}
for (var i = 1; i <=10000 ; i++) {
if(f(i)){
console.log(i)
}
}
var result = ''
for (let i = 1; i <= 10000; i++) {
if (i.toString() === Array.from(i.toString()).reverse().join('')) {
result = result + ' ' + i
}
}
console.log(result)
来个好看懂的,话说1到9不算对称数吧
const symmetryFilter = () => {
let tempArr = [];
for (let index = 10; index < 10000; index++) {
if (String(index).split("").every((item, key, arr) => item === arr[arr.length - 1 - key]))
tempArr.push(index);
}
}
return tempArr;
};
我们没有必要遍历所有数,只需遍历1-99就行了,
然后对1-99 的所有数进行对称一次,
分别找到对称后为奇数长度的和对称后为偶数长度的所有数
`
呀,我们是黑白配。我第一眼的想法并不是循环数组而是去构造所有的对称数,大于10000的时候停止
没必要去遍历10000个数
咋全是遍历所有数字的答案。
以10000 为例,列出所有位数的对称数,比如1位数的 对称数, 2位数的对称数...到5位数, 再判断是否小于10000。
对称数生成 : 遍历最长位数(如5位)。 每个位置遍历 0 - 9,对称即可。
返回一个数组,其值为所有符合条件的数字。
Array.from({length:10000},(v,i) => i+1).slice(9).filter(item => (item+'').split('').reverse().join('') === (item+''));
@zpzxgcr
[...Array(10000).keys()]
取的是 0 - 9999 的数,并不是 1 - 10000 ,如果是 1 - 10000 :假如说现在改为 1 - 9999的话,不加
map
可以取到188个,加map
可以取到189个,9999也应该算是对数,所以应该加map
。[...Array(10000).keys()].filter(function(x){ return x.toString().length>1&&x===Number(x.toString().split('').reverse().join('')) })