来看一道题目:传入一个number类型的数字,返回一个字符串,字符串要求从后往前,每三项以逗号间隔开(PS:才反应过来这是格式化余额...)
当时的思路:反向遍历,每三项填入一个逗号,最后再反向格式化,这思路不好评价,操作步骤繁琐,实现复杂
代码就不贴了,实在不堪入目。。。
当时过于紧张,导致大脑如同乱麻,回过头来想想,其实这是一个非常简单的问题,leetcode上刷了这么多题,居然思路还这样,辣鸡
正确思路:仔细想想,不难发现,数字长度大于3时,无非就这么两种情况:
数字长度除3取余数等于1,类似:'1,234'这种情况
数字长度除3取余数等于2,类似:'12,345'这种情况
那么可以发现,只要保证数字前三位逗号的放置情况,后面就是在此基础上取剩余数字的每三位填充到最终字符串而已
代码:
function demo(num){
const numStr = num.toString();
const start = numStr.length % 3
let res = `${numStr.slice(0,start)}${start !== 0?',':''}`;
for(let i = start; i < numStr.length; i++){
res += numStr[i];
if( i > start && ((i - start + 1) % 3 === 0)) {
res += ',';
}
}
console.log(res.slice(0,res.length-1));
}
甚至,由于确定了前三位的逗号情况后,后续字符的取值都是i到i+3,所以还可以优化为:
function demo(num){
const numStr = num.toString();
const start = numStr.length % 3
let res = `${numStr.slice(0,start)}${start !== 0?',':''}`;
for(let i = start; i < numStr.length; i+=3){
res += numStr.slice(i,i+3) + ',';
}
console.log(res.slice(0,res.length-1));
}
评价:对概念的认识要结合练习来思考,需要对知识更核心的内容深掘和知识本质的探索,以确保不是死记硬背,而是真正理解,并且能够表达清晰,拓宽技术视野,计算机基础概念需要掌握
补充:希望能控制紧张的情绪,紧张的手掌通红,干!
评论区