1234567890 -> '1,234,567,890'
P.S. 考虑兼容性和性能问题
我写的代码:
function numToStr(num) { // STEP 1: type conversion let tempStr = String(num) // STEP 2: modular -> 3 let m = tempStr.length % 3 // STEP 3: slice -> '1 | 234567890' let part1 = `${tempStr.slice(0, m)},` let tempPart2 = tempStr.slice(m), part2 = '' // STEP 4: split -> '234,567,890' for (let i = 0; i < tempPart2.length; i++) { if (i > 0 && i % 3 === 0) { part2 += ',' } part2 += tempPart2.charAt(i) } // STEP 5: combine -> '1,234,567,890' let str = part1 + part2 return str } const number = 1234567890 numToStr(number) // '1,234,567,890'
function numberWithCommas(x) { return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); }
![]() | 1 seki 2020-07-20 19:43:46 +08:00 ![]() 这种题不用想太多,差不多和茴的几种写法一样,见过的用过的就能想到。不过反正至少你也学到了,不亏 |
![]() | 2 zhouyg 2020-07-20 20:14:37 +08:00 常规操作 |
3 JeffGe 2020-07-20 20:18:41 +08:00 function numberWithCommas(x) { return x.toString().split('') .map((s, i, arr) => (arr.length - i - 3) % 3 == 1 ? s + ',' : s) .join(''); } 会正则还是厉害 |
![]() | 4 yuzo555 2020-07-20 20:26:28 +08:00 ![]() number_format(1234567890) 这时候就体现出 PHP 的开发效率了 |
![]() | 5 Kaciras 2020-07-20 20:28:17 +08:00 这种题你不知道环视肯定只能循环。 其实很多正则教程都把这题当例子讲的。 |
![]() | 6 rabbbit 2020-07-20 20:28:31 +08:00 ![]() console.log((1234567890).toLocaleString()); |
![]() | 7 yhxx 2020-07-20 20:31:15 +08:00 让你更怀疑人生的: const num = 1234567890; console.log(num.toLocaleString()); |
![]() | 8 YadongZhang OP |
![]() | 9 seki 2020-07-20 23:14:22 +08:00 ![]() @YadongZhang 这题目其实都也谈不到什么算法技巧,正式算法题都不靠这种「啊哈哈能用正则来一行搞定」的东西来体现水平的 |
![]() | 10 YadongZhang OP @seki 可能面试官根据我的水平出的。。。 |
![]() | 11 baka 2020-07-21 01:05:45 +08:00 ![]() 毕竟是算法题,本来正经 O(n)就能解决。正则 NFA 匹配需要 O(nm),DFA 构造需要 O(2^n)。 |
12 trn4 2020-07-21 01:24:09 +08:00 via iPhone 用正则还叫考虑性能? |
13 billlee 2020-07-21 01:28:46 +08:00 我怎么怀疑这个正则性能可能比手写的还差 |
![]() | 14 also24 2020-07-21 01:42:23 +08:00 ![]() @rabbbit #6 @yhxx #7 你们这个方法就需要考虑兼容性问题了,最好加个 locales 参数指定一下语言(格式),不然容易出现其它结果。 参见: https://developer.mozilla.org/zh-CN/docs/Web/Javascript/Reference/Global_Objects/Number/toLocaleString 顺便说一句,4 楼 @yuzo555 用 php 的内置的 number_format 就没问题,因为那个方法不论什么区域,都是按照 千分位,加 "," 来处理的,不过需要注意的是默认是不管小数部分的。 参见: https://www.php.net/manual/en/function.number-format.php |
![]() | 15 seki 2020-07-21 03:05:45 +08:00 @YadongZhang 我倒没有这个意思。就是提醒你刷算法题的话不用太纠结于这种类型的题,把那些基本题型掌握好更重要。水平之类的想法也不用太多,说不定面试官就是正好题库里面有这么一道题。 当然这种题就算是不用正则的写法,也是有很多种解答的,这个是可以自己琢磨,改进代码风格的 |
![]() | 16 yanguango 2020-07-21 06:50:36 +08:00 不用考虑国际化的吗,有些国家就不是用逗号的。如果是 JS 就用 toLocaleString |
![]() | 17 cmqwan 2020-07-21 08:34:26 +08:00 via iPhone 要写正则时,一般对着百度百科里面到底语法写 |
![]() | 18 ytmsdy 2020-07-21 09:03:34 +08:00 via iPhone 大兄弟,这不叫算法题。 在 acm 里面这玩意儿叫模拟题,基本上属于白送的类型! |
![]() | 19 ZehaiZhang 2020-07-21 10:12:13 +08:00 对着谷歌写正则+1 另外这题目也不算是算法 |
![]() | 20 zy445566 2020-07-21 11:04:05 +08:00 正则性能未必就有手写得好,leetcode 就有很多正则过不去,手写妥妥的题 |
21 zoeliu 2020-07-21 11:07:16 +08:00 正则表达式性能很差,这两种也不算什么是否专业的差距。 可以专门学一下正则,但不需要全部记住,用的时候能查能用即可。 |
![]() | 22 YadongZhang OP |
![]() | 23 Messiahhh 2020-07-21 20:14:16 +08:00 零宽断言表示一个位置,over |
![]() | 24 YadongZhang OP @Messiahhh #23 听都没听过,over |