今天在这篇文章要完成的算法练习是:将一个数按照大小顺序插入到一个数组中,并且找出这个数在该数组中的索引值。
将创建一个函数
并且给这个函数传入两个参数,其中一个参数是数组
- where()
,而另一个参数是
- arr
。函数
- num
要完成的功能是,将参数
- where()
按照大小顺序插入到数组
- num
中,并且找出
- arr
在该数组中的索引值。
- num
将返回
- where([1,2,3,4], 1.5)
- 1
将返回
- where([20,3,5],19)
- 2
将返回
- where([40,60],50)
- 1
实现上述功能,大致思路分为下面几个步骤:
或者
- push()
,把参数
- unshift()
放到
- num
中
- arr
进行排序,在过
- arr
将数组由小到大做升序排序
- sort()
找出
- indexOf()
在数组
- num
中的
- arr
(或者使用
- index
循环)
- for
- index
要将数字
传入数组
- num
中,简单点的方法,可以通过数组的一些方法,比如
- arr
方法将一个元素或多个元素添加到一个数组的末尾,或者通过
- Array.prototype.push()
方法在数组开头添加一个或者多个元素。
- Array.prototype.unshift()
- var arr = [40,60];
- arr.push(50); // [40,60,50]
- // 或者
- arr.unshift(50); //[50,40,60]
另外,函数
另一个功能是要把
- where()
放到数组
- num
中,并且让其由小大到排序。要达到这个效果,那么要将数组进行排序,而数组排序,简单点的方法就是使用
- arr
方法。
- Array.prototype.sort()
使用
方法,需要调用一个
- Array.prototype.sort()
函数,而这个
- compare
函数的主要功能是判断是按升序或降序排列。比如:
- compare
- function compare(a, b) {
- if (a < b) {
- return - 1; // a排在b的前面
- } else if (a > b) {
- return 1; // a排在b的后面
- } else {
- return 0; // a和b的位置保持不变
- }
- }
- arr.sort(compare); //[40,50,60]
有关于数组排序的详细介绍,可以看看早前整理的一篇文章。
最后一步是找出数字
在新数组
- num
中的索引值。要找出
- arr
在数组中的索引值方法有很多种,
- num
或者
- for
循环
- for ... in
方法
- indexOf()
方法
- parseInt()
下面整理了一些实现方法,提供大家参考。在看每个实现方案之前,大家注意,如果方法中的
方法调用了
- sort()
函数的话,在实际使用中应该将下面的函数方法写入进去:
- compare
- function compare(a, b) {
- if (a < b) {
- return - 1; // a排在b的前面
- } else if (a > b) {
- return 1; // a排在b的后面
- } else {
- return 0; // a和b的位置保持不变
- }
- }
当然,你也可以直接写成:
- arr.sort(function compare(a, b) {
- if (a < b) {
- return - 1; // a排在b的前面
- } else if (a > b) {
- return 1; // a排在b的后面
- } else {
- return 0; // a和b的位置保持不变
- }
- });
- function where(arr, num) {
- arr.push(num); // arr = [40,60,50]
- arr.sort(compare); // arr = [40,50,60]
- for (var i = 0,
- len = arr.length; i < len; i++) {
- if (arr[i] === num) {
- return i;
- /*
- * arr = [40,50,60], len = 3, num = 50
- * 遍历次数 i = ? i < len arr[i] arr[i] === num
- * 1st 0 yes 40 false
- * 2nd 1 yes 50 true
- * 3rd 2 yes 60 false
- * 4th 3 no
- * end loop
- *
- */
- }
- }
- }
如果需要确定方法对不对,只需要跑一下文章开头提供的测试用例:
- where([1,2,3,4], 1.5); // 1
- where([20,3,5],19); // 2
- where([40,60],50); // 1
- function where(arr, num) {
- arr.push(num);
- arr.sort(compare);
- return arr.indexOf(num);
- }
- function where(arr, num) {
- arr.sort(compare); // [40,60]
- for (var i in arr) {
- if (arr[i] >= num) {
- return parseInt(i);
- };
- }
- return arr.length;
- }
有关于
更多的介绍可以阅读下面的文章:
- parseInt
- parseInt
doesn’t always correctly convert to integer
- parseInt()
- function where(arr, num) {
- arr.sort(compare);
- for (var i = 0, len = arr.length; i < len; i++) {
- if (arr[i] >= num) {
- return arr.indexOf(arr[i]);
- }
- }
- return arr.length;
- }
- function where(arr, num) {
- arr.sort(compare);
- var count = 0;
- for (var i = 0,
- len = arr.length; i < len; i++) {
- if (arr[i] < num) {
- count++;
- }
- }
- return count;
- }
- function where(arr, num) {
- arr.sort(compare);
- var newArray = [];
- for (var i = 0,
- len = arr.length; i < len; i++) {
- if (arr[i] < num) {
- newArray.push(arr[i]);
- }
- }
- return newArray.length;
- }
- function where(arr, num) {
- let index = arr.sort((x, y) = >x - y).find(x = >num <= x);
- return index === undefined ? arr.length: arr.indexOf(index);
- }
文章总结了几种不同的方法,用来实现将一个数按照大小顺序插入到一个数组中,并且找出这个数在该数组中的索引值。如果你有更好的方案,欢迎在下面的评论中与我们一起分享。
来源: