You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:02:46