Daily-Interview-Question icon indicating copy to clipboard operation
Daily-Interview-Question copied to clipboard

第 81 题:打印出 1 - 10000 之间的所有对称数 例如 121、1331 等

Open zpzxgcr opened this issue 5 years ago • 78 comments

第 81 题:打印出 1 - 10000 之间的所有对称数

例如:121、1331 等

[...Array(10000).keys()].filter((x) => { 
  return x.toString().length > 1 && x === Number(x.toString().split('').reverse().join('')) 
})

image

zpzxgcr avatar May 24 '19 00:05 zpzxgcr

是下标

------------------ 原始邮件 ------------------ 发件人: "robbie"[email protected]; 发送时间: 2019年5月24日(星期五) 上午9:17 收件人: "Advanced-Frontend/Daily-Interview-Question"[email protected]; 抄送: "Subscribed"[email protected]; 主题: Re: [Advanced-Frontend/Daily-Interview-Question] 第 81 题:打印出 1 - 10000 之间的所有对称数 例如:121、1331 等 (#131)

第 81 题:打印出 1 - 10000 之间的所有对称数

例如:121、1331 等 [...Array(10000).keys()].filter((x) => { return x.toString().length > 1 && x === Number(x.toString().split('').reverse().join('')) })

为什么控制台会有一个[0,99],一个[100,188]两个数组?

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or mute the thread.

SilvaYH avatar May 24 '19 01:05 SilvaYH

var result = [];
for (let i = 1; i <= 10000; i++) {
	let origin = '' + i;
	let reverse = origin.split('').reverse().join('');
	if(origin === reverse) {
		result.push(i);
	}
}

sgzhm4444 avatar May 24 '19 01:05 sgzhm4444

let result = [];
for (let i = 1; i <= 10000; i++) {
    let reverse = Number(i.toString().split('').reverse().join(''));
    if (i === reverse) {
        result.push(i);
    }
}

ning-chen avatar May 24 '19 01:05 ning-chen

for(let i = 1; i <= 10000; i++)
    if(isPalindrome(i))
        console.log(i);
var isPalindrome = function(x) {
    if((x < 0) || (x !== 0 && x % 10 === 0))
      return false;
    let tmp = 0;
    while(x > tmp) {
      tmp = tmp * 10 + x % 10;
      x = Math.floor(x / 10);
    }
    return x === tmp || x === Math.floor(tmp / 10);
};

LiJiahaoCoder avatar May 24 '19 01:05 LiJiahaoCoder


 getSame(num) {
    const res = []
    for (let i = 0; i < num; i++) {
        const str = i.toString()
        const reserveStr = str.split('').reverse().join('')
        if (str === reserveStr) {
         res.push(Number(str))
        }
    }
    return res
  }

xiaofengqqcom123 avatar May 24 '19 02:05 xiaofengqqcom123

//第 81 题:打印出 1 - 10000 之间的所有对称数 例如:121、1331 等 
    class Test{
        constructor() {
            this.arr = [];
        }
        symmetry() {
            for(var i = 1; i<=1000;i++) {    
                let flag = true;            
                i = String(i);
                let integer = parseInt(i.length/2);
                for(let j = 0; j < integer; j++) {
                    if(i[j] != i[i.length - j -1]) {
                        flag = false
                    }
                }
                if(flag) {
                    this.arr.push(Number(i))
                }
            }
            return this.arr;
        }
    }
    let test = new Test();
    console.log(test.symmetry()) //[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292, 303, 313, 323, 333, 343, 353, 363, 373, 383, 393, 404, 414, 424, 434, 444,....]

GuoYuFu123 avatar May 24 '19 02:05 GuoYuFu123

[...Array(10000).keys()].filter(function(x){ return x.toString().length>1&&x===Number(x.toString().split('').reverse().join('')) })

jerrychane avatar May 24 '19 03:05 jerrychane

@zpzxgcr [...Array(10000).keys()] 取的是 0 - 9999 的数,并不是 1 - 10000 ,如果是 1 - 10000 :

[...Array(10000).keys()].map(x => x + 1).filter(x => { 
  return x.toString().length > 1 && x === Number(x.toString().split('').reverse().join('')) 
})

假如说现在改为 1 - 9999的话,不加map可以取到188个,加map可以取到189个,9999也应该算是对数,所以应该加map

fxss5201 avatar May 24 '19 03:05 fxss5201

Array.from({length:10000},(v,i) => i+1).slice(9).filter(item => (item+'').split('').reverse().join('') === (item+''));

Robbie-Han avatar May 24 '19 04:05 Robbie-Han

function test(num) {
    let str = num + '';
    var l = str.length;
    for (let i = 0; i < Math.ceil(l / 2); i++) {
        if (str.charAt(i) !== str.charAt(l - i - 1)) {
            return false;
        }
        if ((i === (l - i - 1)) || i === l - i - 2) {
            console.log(str);
        }
    }
}

for (let i = 0; i < 10000; i++) {
    if (i > 10 && i % 10 !== 0) {
        test(i);
    }
}

poozhu avatar May 24 '19 04:05 poozhu

function printSymmetry(begin: number, end: number) {
  const isSymmetry = (str: string) => str === Array.from(str).reverse().join('');

  Array.from({length:end}, (_, index) => index)
    .filter(v => v>begin && isSymmetry(String(v)))
    .forEach(v => console.log(v));
}

printSymmetry(1, 10000);

benzhemin avatar May 24 '19 05:05 benzhemin

[...Array(10000).keys()].filter((x) => {
    return x > 10 && x.toString() === x.toString().split('').reverse().join('');
})

Tsionhe avatar May 24 '19 07:05 Tsionhe

返回一个数组,其值为所有符合条件的数字。

// 方法一
[...Array(10000).keys()].filter(i => i.toString().length > 1 && i == i.toString().split('').reverse().join(''))

// 方法二
[...Array(10000).keys()].filter(i => i > 10 && i == [...i + ''].reverse().join(''))

Nolaaaaa avatar May 24 '19 07:05 Nolaaaaa

咋全是遍历所有数字的答案。

以10000 为例,列出所有位数的对称数,比如1位数的 对称数, 2位数的对称数...到5位数, 再判断是否小于10000。

对称数生成 : 遍历最长位数(如5位)。 每个位置遍历 0 - 9,对称即可。

mydaoyuan avatar May 24 '19 09:05 mydaoyuan

let result=[]
for(let i=1;i<10;i++){
    result.push(i)
    result.push(i*11)
    for(let j=0;j<10;j++){
        result.push(i*101+j*10)
        result.push(i*1001+j*110)
    }
}

没必要去遍历10000个数

liangmuren avatar May 24 '19 13:05 liangmuren

let result=[]
for(let i=1;i<10;i++){
    result.push(i)
    result.push(i*11)
    for(let j=0;j<10;j++){
        result.push(i*101+j*10)
        result.push(i*1001+j*110)
    }
}

没必要去遍历10000个数

呀,我们是黑白配。我第一眼的想法并不是循环数组而是去构造所有的对称数,大于10000的时候停止

wwwjun avatar May 24 '19 14:05 wwwjun

方法一

[...Array(10000).keys()].filter(x => x.toString().length > 1 && x === Number([...x.toString()].reverse().join('')))

方法二

for(let i=0; i<10000; i++){
	let str = i.toString()
	if(str.length>1 && str == [...str].reverse().join('')){
		console.log(Number(str))
	}
}

lerte avatar May 25 '19 05:05 lerte

笨方法实现 */ 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 + '|'; }

		} else if (digit >= 100 && digit <= 999) {
			var ge = i % 10;
			var shi = Math.floor(i / 10) % 10;
			var bai = Math.floor(i / 100) % 10;
			var qian = Math.floor(i / 1000);
			if (qian === ge && shi === bai) {
				str = str + i + '|';
			}
		}
	}
	console.log(str)

liuchao2019 avatar May 26 '19 03:05 liuchao2019

大家的方法都差不多,ES6还是好用。

const isSymmetryNumber = (n) => n > 10 && `${n}` === [...`${n}`].reverse().join('');

const getSymmetryNumber = (num) => Array.from({ length: num }, (n, i) => i + 1).filter(isSymmetryNumber);

pengcc avatar May 26 '19 08:05 pengcc

读这道题,我首先想到的是,最简单的方法是循环10000次,反转数字前后比较如果相等,则打印。可是循环10000次性能也太差了,怎么才能不循环怎么多次呢?利用对称数 image

一、循环1000次,笨方法

// 反转数字
function reverse {
	if (n < 0) {
        n = n.toString().split('-')[1]; // 负数提取数字
        n = '-' + [...n].reverse().join('');
        n = +n; // 转数字
    } else {
        n = n.toString(); // 转字符
        n = +[...n].reverse().join(''); // 转为数组 颠倒数组 再合字符 最后转数字
    }
    if (n >= Math.pow(2, 31) - 1 || n <= Math.pow(-2, 31) + 1) { // 判断溢出
        return 0;
    }
    return n;
}
 var arr=[];
for(var i = 0; i<10000; i++) {
   var num = reverse(i); // 反转数字
    if (i===num&&i>9) { // 判断数字和反转后的数字是否相等且不是一位数
      arr.push(i);
    }
}
console.log(arr);

二、利用对称数

以10000 为例,列出所有位数的对称数,比如1位数的 对称数, 2位数的对称数...到5位数, 再判断是否小于10000。 对称数生成 : 遍历最长位数(如5位)。 每个位置遍历 0 - 9,对称即可。

var result = [];
for(let i=1;i<10;i++){  
    result.push(i*11); // 两位数的对称数
    for(let j=0;j<10;j++){
        result.push(i*101+j*10) //  三位数的对称数
        result.push(i*1001+j*110) // 四位数的对称数,当i和j均为9是值为9999
    }
}
console.log(result);

luohong123 avatar May 27 '19 08:05 luohong123

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位

这个方法可以得到结果,但不够通用

chouzhenyi avatar May 27 '19 11:05 chouzhenyi

暴力解法

for (let i = 1; i <= 10000; i++) {
      if (i == Number(i.toString().split('').reverse().join(''))) {
        console.log(i);
      }
    }   

sohoorc avatar May 28 '19 06:05 sohoorc

第 81 题:打印出 1 - 10000 之间的所有对称数

例如:121、1331 等

[...Array(10000).keys()].filter((x) => { 
  return x.toString().length > 1 && x === Number(x.toString().split('').reverse().join('')) 
})

image

大佬,进行筛选的是下标(0 ~ 9999),不是(1 ~ 10000),如果题目要求时(1~9999)就有问题了,

ckjie avatar Jun 24 '19 13:06 ckjie

强答:

[...Array(10000).keys()].filter(num => {
  const len = ('' + num).length
  if (len === 1) return true

  return (
    '' + num ===
    ('' + num)
      .split('')
      .reverse()
      .join('')
  )
})

chen86860 avatar Jun 26 '19 08:06 chen86860


//  the first solution

const symmetry0 = (min, max) => {

    let res = [];

    for(let i = min; i <= max; i ++) {

        if(i.toString().length > 1 && i.toString().split('').reverse().join('') === i.toString()) {

            res.push(i);
        }
    }

    return res;
}
console.log(symmetry0(1, 10000));

//  the second solution
const symmetry = (min, max) => {

    let arr = Array.from({length: max - min + 1}, (item, index) => index += min);

    return arr.filter(item => item.toString().split('').reverse().join('') === item.toString());
    
}
console.log(symmetry(1, 10000));

dorseysen avatar Jun 27 '19 08:06 dorseysen

let result=[]
for(let i=1;i<10;i++){
    result.push(i)
    result.push(i*11)
    for(let j=0;j<10;j++){
        result.push(i*101+j*10)
        result.push(i*1001+j*110)
    }
}

1 - 9 应该不能算对称数吧

CasoMemory avatar Jul 03 '19 11:07 CasoMemory

function a(n) {
    let go = true
    let i = 1;
    let num;

    while(go){            
        go = false
        num = `${i}${i.toString().split('').reverse().join('')}`

        if(num < n){
            go = true
            console.log(num)
        }

        if(i > 9){
            num = `${i}${i.toString().slice(0, -1).split('').reverse()}`

            if(num < n){
                go = true
                console.log(num)
            }
        }
        i++;
    }
}

a(10000)

pndllxzzy avatar Jul 09 '19 11:07 pndllxzzy

for (let i = 0; i < 100000; i++) { if (''.split.call(i, '').reverse().join('') == i) console.log(i) }

chphaeton avatar Jul 10 '19 10:07 chphaeton

;[...Array(10000).keys()].filter((v) => {
  return v === Number( (String(v).match(/(^\d)(\d)?\2*\1$/) || [])[0] )
})

精简一下
;[...Array(10000).keys()].filter(v => {
  return (String(v).match(/(^\d)(\d)?\2*\1$/) || [])[0]
})

再精简一下
;[...Array(1e4).keys()].filter(v => (v+'').match(/(^\d)(\d)?\2*\1$/))

vizoy avatar Jul 10 '19 14:07 vizoy

Array.from({length: 10000}, (o, i) => i).filter(o => o + '' === (o + '').split('').reverse().join(''))

jackYouth avatar Jul 11 '19 07:07 jackYouth