Daily-Interview-Question
Daily-Interview-Question copied to clipboard
第 81 题:打印出 1 - 10000 之间的所有对称数 例如 121、1331 等
第 81 题:打印出 1 - 10000 之间的所有对称数
例如:121、1331 等
[...Array(10000).keys()].filter((x) => {
return x.toString().length > 1 && x === Number(x.toString().split('').reverse().join(''))
})
是下标
------------------ 原始邮件 ------------------ 发件人: "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.
var result = [];
for (let i = 1; i <= 10000; i++) {
let origin = '' + i;
let reverse = origin.split('').reverse().join('');
if(origin === reverse) {
result.push(i);
}
}
let result = [];
for (let i = 1; i <= 10000; i++) {
let reverse = Number(i.toString().split('').reverse().join(''));
if (i === reverse) {
result.push(i);
}
}
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);
};
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
}
//第 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,....]
[...Array(10000).keys()].filter(function(x){ return x.toString().length>1&&x===Number(x.toString().split('').reverse().join('')) })
@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
。
Array.from({length:10000},(v,i) => i+1).slice(9).filter(item => (item+'').split('').reverse().join('') === (item+''));
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);
}
}
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);
[...Array(10000).keys()].filter((x) => {
return x > 10 && x.toString() === x.toString().split('').reverse().join('');
})
返回一个数组,其值为所有符合条件的数字。
// 方法一
[...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(''))
咋全是遍历所有数字的答案。
以10000 为例,列出所有位数的对称数,比如1位数的 对称数, 2位数的对称数...到5位数, 再判断是否小于10000。
对称数生成 : 遍历最长位数(如5位)。 每个位置遍历 0 - 9,对称即可。
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个数
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的时候停止
方法一
[...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))
}
}
笨方法实现 */ 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)
大家的方法都差不多,ES6还是好用。
const isSymmetryNumber = (n) => n > 10 && `${n}` === [...`${n}`].reverse().join('');
const getSymmetryNumber = (num) => Array.from({ length: num }, (n, i) => i + 1).filter(isSymmetryNumber);
读这道题,我首先想到的是,最简单的方法是循环10000次,反转数字前后比较如果相等,则打印。可是循环10000次性能也太差了,怎么才能不循环怎么多次呢?利用对称数
一、循环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);
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位
这个方法可以得到结果,但不够通用
暴力解法
for (let i = 1; i <= 10000; i++) {
if (i == Number(i.toString().split('').reverse().join(''))) {
console.log(i);
}
}
第 81 题:打印出 1 - 10000 之间的所有对称数
例如:121、1331 等
[...Array(10000).keys()].filter((x) => { return x.toString().length > 1 && x === Number(x.toString().split('').reverse().join('')) })
大佬,进行筛选的是下标(0 ~ 9999),不是(1 ~ 10000),如果题目要求时(1~9999)就有问题了,
强答:
[...Array(10000).keys()].filter(num => {
const len = ('' + num).length
if (len === 1) return true
return (
'' + num ===
('' + num)
.split('')
.reverse()
.join('')
)
})
// 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));
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 应该不能算对称数吧
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)
for (let i = 0; i < 100000; i++) { if (''.split.call(i, '').reverse().join('') == i) console.log(i) }
;[...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$/))
Array.from({length: 10000}, (o, i) => i).filter(o => o + '' === (o + '').split('').reverse().join(''))