Javascript 从右边获取最小和最大的数字,从左边获取我的值
请告诉我是否有更快、更优雅的方法来获得此结果:Javascript 从右边获取最小和最大的数字,从左边获取我的值,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,请告诉我是否有更快、更优雅的方法来获得此结果: 我有一个数字数组,一旦设置了一个值,我应该得到右边最小和最高的数字,左边是我的值 例如,如果我有[1,2,3,4,6,7,8,9],且值为5, 我的号码是:1,4,6,9 如果值为4 我的号码是1,4,4,9 我可怕的代码是: var arr = [1, 8, 2, 3, 9, 5, 4, 6, 7]; var result1 = []; var result2 = []; var goal = 5; for (a = 0; a < arr.
我有一个数字数组,一旦设置了一个值,我应该得到右边最小和最高的数字,左边是我的值 例如,如果我有[1,2,3,4,6,7,8,9],且值为5,
我的号码是:1,4,6,9
如果值为4
我的号码是1,4,4,9
我可怕的代码是:
var arr = [1, 8, 2, 3, 9, 5, 4, 6, 7];
var result1 = [];
var result2 = [];
var goal = 5;
for (a = 0; a < arr.length; a++) {
if (arr[a] < goal) {
result1.push(arr[a])
} else if (arr[a] === goal) {
result1.push(arr[a]);
result2.push(arr[a]);
} else {
result2.push(arr[a]);
}
};
var count1 = result1[0];
for (x = 0; x < result1.length; x++) {
if (result1[x] < count1) {
count1 = result1[x]
}
};
var count11 = result1[0];
for (xx = 0; xx < result1.length; xx++) {
if (result1[xx] > count11) {
count11 = result1[xx]
}
};
var count2 = result2[0];
for (y = 0; y < result2.length; y++) {
if (result2[y] > count2) {
count2 = result2[y]
}
};
var count22 = result2[0];
for (yy = 0; yy < result2.length; yy++) {
if (result2[yy] < count22) {
count22 = result2[yy]
}
};
console.log(count1 + ' ' + count11 + ' ' + count22 + ' ' + count2)
var-arr=[1,8,2,3,9,5,4,6,7];
var result1=[];
var result2=[];
var目标=5;
对于(a=0;acount11){
count11=result1[xx]
}
};
var count2=result2[0];
对于(y=0;ycount2){
count2=result2[y]
}
};
var count22=result2[0];
对于(yy=0;yy
假设数组始终排序
var array = [1, 2, 3, 4, 6, 7, 8, 9],
number = 5,
pivot, small, large;
for (var i = 0, len = array.length; i < len; i += 1) {
if (array[i] >= number) {
pivot = i;
break;
}
}
if (pivot > 0) {
small = [array[0], array[pivot - 1]];
large = [array[pivot], array[len - 1]];
console.log(small, large);
} else {
console.log("Not possible");
}
var数组=[1,2,3,4,6,7,8,9],
数字=5,
枢轴,小,大;
对于(变量i=0,len=array.length;i=number){
pivot=i;
打破
}
}
如果(轴>0){
small=[array[0],array[pivot-1];
大=[array[pivot],array[len-1];
控制台日志(小,大);
}否则{
控制台日志(“不可能”);
}
编辑
虽然我意识到问题已经得到了回答,并且选择了另一个回答,但我至少想将代码更新到一个测试版本。FWIW,它可以工作,不依赖也不假设排序数组
function minmax(valueArray, targetValue) {
var i = 0;
var minBelow;
var maxBelow;
var minAbove;
var maxAbove;
while (i < valueArray.length) {
var currentValue = valueArray[i];
if (currentValue < targetValue) {
if (currentValue < minBelow || !minBelow) {
minBelow = currentValue;
}
if (currentValue > maxBelow || !maxBelow) {
maxBelow = currentValue;
}
}
if (currentValue > targetValue) {
if (currentValue < minAbove || !minAbove) {
minAbove = currentValue;
}
if (currentValue > maxAbove || !maxAbove) {
maxAbove = currentValue;
}
}
i++;
}
return {
minBelow: minBelow,
maxBelow: maxBelow,
minAbove: minAbove,
maxAbove: maxAbove
};
通过使用一些强大的方法,您可以大大简化代码:和/:
var-arr=[1,8,2,3,9,5,4,6,7];
var目标=5;
var result1=arr.filter(函数(x){return x=goal});
var count1=Math.min.apply(Math,result1);
var count11=Math.max.apply(Math,result1);
var count2=Math.min.apply(Math,result2);
var count22=Math.max.apply(Math,result2);
我想出了以下解决方案。考虑到数组总是被排序的
function GetVals(arr, pivot){
return arr.reduce(function(t,v,i,arr){
if (v < pivot) {
if (typeof t.LMin == "undefined" || t.LMin > v)
t.LMin = v;
if (typeof t.LMax == "undefined" || t.LMax < v)
t.LMax = v;
} else if (v > pivot) {
if (typeof t.RMin == "undefined" || t.RMin > v)
t.RMin = v;
if (typeof t.RMax == "undefined" || t.RMax < v)
t.RMax = v;
}
return t;
}, {});
}
函数GetVals(arr,pivot){
返回arr.reduce(函数(t,v,i,arr){
if(vLMin
LMax
,以及右最大值的RMin
LMin
和LMax
相等,则表示左侧只有一个值(右侧的规则相同)
如果
LMin
和LMax
未定义,这意味着左小于轴没有值。如果数组未排序,则只能循环遍历它。示例中的是,但演示中的arr
不是。请描述数字数组的约束条件。它总是分类的吗?它有很多差距吗?它有重复的值吗?新对象({mindown,maxdown,minAbove,maxover})
看起来肯定像伪代码:-)result1应该是至少两个调用中的result2:)@DavidW:Thx,太多c&p:-)
var arr = [1, 8, 2, 3, 9, 5, 4, 6, 7];
var goal = 5;
var result1 = arr.filter(function(x) { return x <= goal });
var result2 = arr.filter(function(x) { return x >= goal });
var count1 = Math.min.apply(Math, result1);
var count11 = Math.max.apply(Math, result1);
var count2 = Math.min.apply(Math, result2);
var count22 = Math.max.apply(Math, result2);
function GetVals(arr, pivot){
return arr.reduce(function(t,v,i,arr){
if (v < pivot) {
if (typeof t.LMin == "undefined" || t.LMin > v)
t.LMin = v;
if (typeof t.LMax == "undefined" || t.LMax < v)
t.LMax = v;
} else if (v > pivot) {
if (typeof t.RMin == "undefined" || t.RMin > v)
t.RMin = v;
if (typeof t.RMax == "undefined" || t.RMax < v)
t.RMax = v;
}
return t;
}, {});
}