经典算法题:给出一个正整数,需要将数字千分位格式化,输出字符串。

示例 1:
3,134,250,234示例 2:
123// 数字千分位格式 数组反转
export function format1(n: number): string {
n = Math.floor(n) // 只考虑整数
const s = `${n}`
const arr = s.split('').reverse()
return arr.reduce((prev, val, index) => {
if (index % 3 === 0) {
if (prev) {
return val + ',' + prev
} else {
return val
}
} else {
return val + prev
}
}, '')
}
// 数字千分位格式化 字符串分析
export function format2(n: number):string {
n = Math.floor(n)
let res = ''
const s = n.toString()
const len = s.length
for (let i = len - 1; i >= 0; i--) {
const j = len - i
if (j % 3 === 0) {
if (i === 0) {
res = s[i] + res
} else {
res = ',' + s[i] + res
}
} else {
res = s[i] + res
}
}
return res
}
// 数字千分位格式化 test
import { format1, format2 } from '../thousands-format.ts'
describe('数字千分位格式化 数组反转', () => {
it('正常情况', () => {
const n = 1241475429
const res = format1(n)
expect(res).toBe('1,241,475,429')
})
it('小于 1000', () => {
expect(format1(0)).toBe('0')
expect(format1(122)).toBe('122')
})
})
describe('数字千分位格式化 字符串分析', () => {
it('正常情况', () => {
const n = 1241475429
const res = format2(n)
expect(res).toBe('1,241,475,429')
})
it('小于 1000', () => {
expect(format2(0)).toBe('0')
expect(format2(122)).toBe('122')
})
})
两种方法整体复杂度都是 O(n),但是 方法1 使用数组,转换、操作会影响性能,因此使用 字符串 性能更好。
欢迎访问:天问博客