javascript - 查找数组的第 k 个元素
问题描述
我试图弄清楚这段代码是如何工作的。
function Kth_greatest_in_array(arr, k) {
for (let i = 0; i < k; i++) {
let max_index = i;
const tmp = arr[i];
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] > arr[max_index]) {
max_index = j;
}
}
arr[i] = arr[max_index];
arr[max_index] = tmp;
}
return arr[k - 1];
}
console.log(Kth_greatest_in_array([1,2,6,4,5], 3))
如您所见,目标是找到第三大价值。但我不知道第二个循环是如何工作的。能不能一步一步给我解释一下。例如,veriable j 是什么意思,尤其是为什么他们输入 let j = i +
解决方案
此方法基本上执行数组的就地排序arr
(但仅“k”次 - 不是完整排序),然后返回索引处的元素(来自现在部分排序的数组)k-1
。
内部for
循环查看数组的剩余(未排序)部分以找到具有最高值的项目的索引:
if (arr[j] > arr[max_index]) {
max_index = j;
}
您所询问的具体语句let j = i + 1
, 表示“声明一个新变量 ,j
并将其初始值设置为比外for
循环的当前迭代大一”。“ j
”是任意的,可以是任何有效的标识符,它只是在嵌套循环时经常使用,for
因为最外层循环通常使用 i
(可能是“索引”的缩写)。
在外循环的每次迭代结束时for
,这些行交换数组元素,以便该元素位于正确的位置:
arr[i] = arr[max_index];
arr[max_index] = tmp;
如果您想真正了解这种方法的内部工作原理,我强烈建议您使用调试器逐步完成它 - 这可能是一次很棒的学习体验。即使只是使用一些临时console.log
语句的经过验证的方法也可以帮助阐明正在发生的事情(例如,打印每次外部和内部循环迭代的状态arr
和之后的状态)。max_index
推荐阅读
- python - 使用python更改文件格式
- c# - 如何添加数据文件进行构建?
- pine-script - Pinescript - 十进制输入选项
- unreal-engine4 - UE4:从父类中的另一个参与者调用函数
- entity-framework - 无法通过 Linq 查询获取多个表字段的计数
- php - 当公司来自欧盟时,在 WooCommerce 中添加“增值税反向收费”
- jsdoc - 我们可以在传递函数文字作为参数时使用 JSDoc @this
- python - 用于分类问题的多个文本列的特征提取
- javascript - Phaser 2 确定哪个单元处于活动状态
- sql-server - 进口商截断 nvarchar