如何优化countTinyPairs执行效率?能否自测运行耗时?
关于你的CodeSignal练习测试优化问题
嘿,我来帮你逐一拆解这些问题!
1. 修改后的代码确实快很多!
你最初的代码用了双重循环(for (num in a)嵌套for (num in b)),这意味着当数组长度为n时,要执行n*n次操作(时间复杂度为O(n²))。但题目要求的配对规则其实是a的第i个元素对应反转后b的第i个元素(也就是原b的第n-1-i个元素),完全不需要遍历整个b来配对!
再加上你原来还做了数组查重(arr.findIndex),这个操作每次也要遍历数组,进一步拖慢了速度。修改后的代码改成了单次遍历,只执行n次操作(时间复杂度O(n)),大数据量下的差距会非常明显——比如当数组长度是10000时,原代码要跑1亿次操作,修改后只需要1万次,肯定不会超时了。
2. 怎么自行检测代码运行耗时?
在JavaScript里,你可以用performance.now()或者Date.now()来测量代码的执行时间,前者精度更高(能到微秒级别)。举个实操例子:
function countTinyPairs(a, b, k) { let pairs = 0; const reversedB = [...b].reverse(); // 用浅拷贝避免修改原数组 for (let i = 0; i < a.length; i++) { const combined = String(a[i]) + String(reversedB[i]); if (Number(combined) < k) { // 转成数字再比较,避免字符串字典序的坑 pairs++; } } return pairs; } // 生成大数据量测试用例模拟隐藏场景 const testLength = 100000; const testA = Array.from({length: testLength}, () => Math.floor(Math.random() * 1000)); const testB = Array.from({length: testLength}, () => Math.floor(Math.random() * 1000)); const testK = 100000; // 测量耗时 const startTime = performance.now(); countTinyPairs(testA, testB, testK); const endTime = performance.now(); console.log(`代码运行耗时:${(endTime - startTime).toFixed(2)} 毫秒`);
这里额外给你加了两个小细节优化:一是用[...b].reverse()避免修改原数组(b.reverse()会直接改变原数组,可能带来意外问题);二是把拼接后的字符串转成数字再和k比较,因为字符串的字典序比较和数字大小比较有时候结果不一致(比如"99"和"100",字符串比较"99">"100",但数字99<100),能避免逻辑错误。
3. 必须掌握BigO才能写出高效代码吗?
不一定,但掌握它能让你更系统地解决效率问题。
- 如果你没学BigO,也可以通过「减少不必要的循环和重复操作」这个朴素思路优化代码——比如你这次就发现了原代码的内层循环和查重都是多余的,直接改成单次遍历就搞定了,这就是很好的例子。
- 但学了BigO之后,你能快速判断不同写法的效率差异:比如一眼看出嵌套循环是O(n²),单次遍历是O(n),知道前者在大数据量下必然超时,从而从根源上避免写出低效代码。
所以,BigO是工具,不是必须的门槛,但学会它能让你解决这类问题更得心应手。
内容的提问来源于stack exchange,提问作者Cat
相关产品推荐
相关产品推荐

