Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从数字数组中删除一个数字以对数组进行排序_Javascript_Arrays_Sorting - Fatal编程技术网

Javascript 从数字数组中删除一个数字以对数组进行排序

Javascript 从数字数组中删除一个数字以对数组进行排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我们有一个数字数组,我们需要找到我们可以删除数组中一个数字的方法的总数,如果删除它,将对数组进行排序 例如,如果我们有[3,4,5,4],我们应该返回2,因为如果我们删除5或第二个4,我们的数组将被排序 但是如果我们得到像[4,5,2,3,4]这样的值,我们应该返回0,因为删除它们中的任何一个都不会对数组排序 我相信这与 如果我错了,请纠正我,但这应该是这样的: 我们应该找到最长的递增子序列并删除不在该子序列中的所有内容 考虑到这一点,我使用了如下函数来查找LIS: function findS

我们有一个数字数组,我们需要找到我们可以删除数组中一个数字的方法的总数,如果删除它,将对数组进行排序

例如,如果我们有[3,4,5,4],我们应该返回2,因为如果我们删除5或第二个4,我们的数组将被排序

但是如果我们得到像[4,5,2,3,4]这样的值,我们应该返回0,因为删除它们中的任何一个都不会对数组排序

我相信这与

如果我错了,请纠正我,但这应该是这样的:

我们应该找到最长的递增子序列并删除不在该子序列中的所有内容

考虑到这一点,我使用了如下函数来查找LIS:

function findSubsequence(arr){
var allSubsequence = [],
    longestSubsequence = null,
    longestSubsequenceLength = -1;

for(var i=0;i<arr.length;i++){          //i=1
    var subsequenceForCurrent = [arr[i]],
        current = arr[i],
        lastElementAdded = -1;
    for(var j=i;j<arr.length;j++){
        var subsequent = arr[j];
        if((subsequent > current) && (lastElementAdded<subsequent)){
            subsequenceForCurrent.push(subsequent);
            lastElementAdded = subsequent;
        }
    }
    allSubsequence.push(subsequenceForCurrent);
}
for(var i in allSubsequence){
    var subs = allSubsequence[i];
    if(subs.length>longestSubsequenceLength){
        longestSubsequenceLength = subs.length;
        longestSubsequence = subs;
    }
}
return longestSubsequence;
}


(function driver(){
    var sample = [87,88,91, 10, 22, 9,92, 94, 33, 21, 50, 41, 60, 80];
    console.log(findSubsequence(sample));
})();
函数查找子序列(arr){
var allSubsequence=[],
longestSubsequence=null,
最长子序列长度=-1;

对于(var i=0;i,您可以使用数学库删除最大值

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <script type="text/javascript">
var sample = [87,88,91, 10, 22, 9,92, 94, 33, 21, 50, 41, 60, 80];
sample.sort(function(a, b){return a - b});
list = remove_highest(sample)

console.log(list) // [9, 10, 21, 22, 33, 41, 50, 60, 80, 87, 88, 91, 92]

function remove_highest(list) {
    return list.filter(function(n) { return n != Math.max.apply( Math, list ) })
}       
    </script>

</body>
</html>

var样本=[87,88,91,10,22,9,92,94,33,21,50,41,60,80];
sort(函数(a,b){返回a-b});
列表=删除(样本)
console.log(列表)/[9,10,21,22,33,41,50,60,80,87,88,91,92]
功能删除(列表){
return list.filter(函数(n){return n!=Math.max.apply(Math,list)})
}       

这种方法似乎有点复杂。我认为使用蛮力方法会更清晰,也不会占用太多资源:对于数组中的每一项,尝试删除它,然后检查数组是否已排序。但不要使用
排序
来检查它是否已排序(这具有
O(N log N)
复杂性),只需检查数组中的每个项是否与前一项相同或更大(
O(N)
):

const checkSorted=arr=>arr.every((num,i,arr)=>i==0 | | num>=arr[i-1]);
const checkRemovalCount=arr=>arr.reduce((countSoFar,i,arr)=>{
常量removedArr=[…arr.slice(0,i),…arr.slice(i+1)];
返回countSoFar+checkSorted(removedArr);
}, 0);
日志(checkRemovalCount([3,4,5,4]);
日志(checkRemovalCount([4,5,2,3,4]);

log(checkRemovalCount([87,88,91,10,22,9,92,94,33,21,50,41,60,80]))
您的意思是删除最高数字而不改变位置?如果4不是最高数字,而是5,为什么您可以删除4?@VasimVanzara应该返回通过删除其中一个来删除最高数字的方法数。@CertainPerformance我应该找到所有可能的方法,从数组中删除一个数字,这样一个选项是5,这将给我们3,4,4,这仍然是排序,另一个是删除最后的4,这将给我们3,4,5@EmadDehnavi此时,问题描述似乎有点模糊,因为当前的问题描述说删除最高数字之一。在
[3,1,4,5]
1是最低的数字,但它也是第四高的数字。当然,对于长度为L的数组,任何数字都将是第十高的数字之一。因此,关于最高数字的部分可能没有限制性,也没有任何作用,或者如果我误解了,那么可能需要在数学上更正式一些。但它应该是如果仅从数组中删除它,请对数组进行排序。删除后,您可以对数组进行排序。@EmadDehnavi我已更新了我的答案。上述代码的输出将是[9、10、21、22、33、41、50、60、80、87、88、91、92],这是最好的方法。