【问题标题】:Output largest element on the right for each element in an Array为数组中的每个元素输出右侧的最大元素
【发布时间】:2015-08-25 06:36:27
【问题描述】:

考虑Arr1 = [4, 6, 3, 9, 11, 5]的输入

我想要一个将数组作为输入的函数。 对于数组中的每个元素,它应该在其右侧输出第一个较高的值。

示例输出:4 - 6; 6 - 9; 3 - 9; 9 - 11 , 11 - -1 , 5 - -1

要求:我想在不使用嵌套 for 循环的情况下实现这一点。


for (i = 0,k = Arr1.length;i< k;i ++){
            var val = false;
            for(j=i+1;j<k;j++){

                while(Arr1[i] < Arr1[j] ){

                        console.log( Arr1[i] + " --" + Arr1[j]);
                        val = true;
                        break;
                }
                if(val){break;}
            }
            if( !val){
                console.log( Arr1[i] + " --" +" -1");
            }

        }

【问题讨论】:

  • 到目前为止你尝试过什么?你到底卡在哪里了?您能给我们展示一些可以使用的代码吗?
  • 请添加更多代码,以便我们帮助您(并理解您)
  • @icke 希望我的问题现在可以理解了。
  • @AvinashK 很高兴您添加了代码,但您的问题仍然没有问题。你的代码不起作用吗?它不做它应该做的事吗?其结果与预期有何不同?等等等等。
  • 您的while 循环非常没用。为什么不简单地使用if?嵌套的for 循环可能也可以减少。

标签: javascript loops


【解决方案1】:

这是一个如何做的例子。这个想法是遍历您的数组,然后查看您当前正在查看的元素之后的每个元素,直到找到更大的元素。较大的元素(或默认为 -1)被推入第二个数组进行存储。

var Arr1 = [4, 6, 3, 9, 11, 5];
var Arr2 = [];
for (var i=0;i<Arr1.length;i++) {
    var biggerNumber = -1;
    for (var j=i+1;j<Arr1.length;j++) {
        if (Arr1[j]>Arr1[i]) {
            biggerNumber = Arr1[j];
            break;
        }
    }
    Arr2.push(biggerNumber);
}
//output: 
for(var i=0;i<Arr1.length;i++) {
    console.log(Arr1[i]+" -- "+Arr2[i]);
}

更新答案

var Arr1 = [4, 6, 3, 9, 11, 5];
var stack=[];
Arr1.forEach(function(i){
    if (stack.length==0 || i<=stack[stack.length-1]) {
        stack.push(i);
    } else {
        while(stack.length>0 && i>stack[stack.length-1]) {
            console.log(i);
            stack.pop();
        }
        stack.push(i);
    }
});
stack.forEach(function(){console.log(-1);});

为什么更好:内部循环总共执行Arr1.length 操作,所以它仍然在 O(n) 中运行。如何在没有嵌套循环的情况下实现它我仍然不知道。

【讨论】:

  • 这对我来说很清楚。使用它,我可以删除我的 break 语句,并且可以在不使用另一个 if 条件的情况下推送 -1 值。但我想在不使用嵌套循环的情况下实现这一点。有什么想法吗?
  • 抱歉,除了在函数中隐藏第二个内部循环或使用在内部执行循环的内置函数之外,我想不出只使用一个循环的方法。跨度>
  • 在这个问题中我们可以使用 Stacks 做些什么吗?
  • 我看不出这有什么帮助。我很想知道是否有解决方案,但我想不出一个。
  • 昨天在一次采访中被问到这个问题。我告诉他一个与我上面的解决方案非常接近的逻辑。他让我不要使用嵌套循环。我也想不出更好的办法。当我问他你将如何改进这一点时,他的确切回答是:“使用堆栈。试试看”。
猜你喜欢
  • 2022-12-31
  • 2021-11-07
  • 1970-01-01
  • 2014-04-09
  • 2021-05-21
  • 2017-04-24
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
相关资源
最近更新 更多