Tiven

Tiven

博观而约取,厚积而薄发

天问的个人网站(天问博客),专注于Node.js、Vue.js、React、Vite、Npm、Nginx等大前端技术。不断学习新技术,记录日常开发问题,持续分享coding,极客开源,共同进步。生命不息,奋斗不止... [ hexo blog ]

【数据结构与算法】(17):数字千分位格式化


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

数据结构与算法 · 数字千分位格式化

一、问题示例

示例 1:

  • 输入:3134250234
  • 输出:3,134,250,234

示例 2:

  • 输入:123
  • 输出:123

二、代码演示

  1. 数字千分位格式 数组反转
// 数字千分位格式 数组反转

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
    }
  }, '')
}
  1. 数字千分位格式化 字符串分析
// 数字千分位格式化 字符串分析

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 使用数组,转换、操作会影响性能,因此使用 字符串 性能更好。


欢迎访问:天问博客