Javascript挑战-哪个篮子包含最后一个苹果?

Javascript挑战-哪个篮子包含最后一个苹果?,javascript,Javascript,我面临以下挑战性问题: 房间里有一圈100个篮子;篮子已经编号了 按照从1到100的顺序排列,每个篮子包含一个苹果。 最终,篮子1中的苹果将被移除,但篮子1中的苹果将被移除 将跳过第2篮。然后将移除篮3中的苹果。 这将继续(绕着圆圈移动,将一个苹果从树上移开) 篮子,跳过下一个)直到篮子里只剩下一个苹果。 写一些代码来确定剩下的苹果在哪个篮子里 在 我得出结论,篮子100将包含最后一个苹果,以下是我的代码: var allApples = []; var apples

我面临以下挑战性问题:

房间里有一圈100个篮子;篮子已经编号了 按照从1到100的顺序排列,每个篮子包含一个苹果。 最终,篮子1中的苹果将被移除,但篮子1中的苹果将被移除 将跳过第2篮。然后将移除篮3中的苹果。 这将继续(绕着圆圈移动,将一个苹果从树上移开) 篮子,跳过下一个)直到篮子里只剩下一个苹果。 写一些代码来确定剩下的苹果在哪个篮子里 在

我得出结论,篮子100将包含最后一个苹果,以下是我的代码:

     var allApples = [];
        var apples = [];
        var j = 0;
        var max = 100; 
        var o ='';
            while (j < max) {
                o += ++j;
                allApples.push(j);
            }

            var apples = allApples.filter(function(val) {
                return 0 == val % 2;
            });
            while (apples.length > 1) {
                for (i = 0; i < apples.length; i += 2) {
                    apples.splice(i, 1);
                }
            }

            console.log(apples);
var allApples=[];
var=[];
var j=0;
var max=100;
var o=“”;
而(j1){
对于(i=0;i<0.length;i+=2){
苹果.拼接(i,1);
}
}
控制台。日志(苹果);
我的问题是:我做得对吗?我关心的是对篮子“一圈”的描述。我不确定这是否与我如何编写解决方案相关。剩下的苹果所在的篮子会不会是一个被跳过的篮子


我希望有人能让我知道,如果我回答正确,回答部分正确或我的答案是完全错误的。谢谢你的帮助。

我相信科林·德克鲁是对的,有一个简单的说法可以解决这个问题。我真的很想知道这个答案

这是我的暴力解决方案。我不是将项目(“苹果”)从其原始容器(“篮子”)移动到丢弃堆中,而是简单地将容器值从true或false更改为表示项目不再存在

var items = 100;
var containers = [];

// Just building the array of containers
for(i=0; i<items; i++) {
    containers.push(true);
}

// count all containers with value of true
function countItemsLeft(containers) {
    total = 0;
    for(i=0; i<containers.length; i++) {
        if(containers[i]) {
            total++;
        }
    }
    return total;
}

// what is the index of the first container
// with a value of true - hopefully there's only one
function getLastItem(containers) {
    for(i=0; i<containers.length; i++) {
        if(containers[i]) {
            return(i);
        }
    }
    // shouldn't get here if the while loop did it's job
    return false;
}

var skip = false;
// loop through the items,
// setting every other to false,
// until there is only 1 left
while(countItemsLeft(containers) > 1) {
    for(i=0; i<containers.length; i++) {
        if(containers[i]) {
            if(skip) {
                skip = false;
            } else {
                containers[i] = false;
                skip = true;
            }
        }
    }
}

// what's the last item? add one to account for 0 index
// to get a human readable answer
var last_item  = getLastItem(containers) + 1;
var项目=100;
var容器=[];
//只是构建容器数组

对于(i=0;i所以,…我也进入了这个问题:)

我将上一个答案的输入/输出进行了分解,这揭示了一个非常简单的模式

基本上,如果项目总数是2的幂,那么它将是最后一个项目。之后的附加项将使第二项成为最后一项。之后每增加一项,最后一项将增加2,直到你达到另一项计数,再次被2的幂整除。冲洗并重复

仍然不是一行,但会比我之前的答案快得多。这不适用于1项

var items = 100;

function greatestPowDivisor(n, p) {
    var i = 1;
    while(n - Math.pow(p, i) > 0) {
        i++;
    }
    return Math.pow(p, (i - 1));
}

var d = greatestPowDivisor(items, 2)
var last_item = (items - d) * 2;

你似乎误解了这个问题。让我们从5个苹果开始围成一个圈。我们在第一阶段移除了第一、第三和第五个,留下了第二和第四个。现在,在我们移除第五个篮筐后,下一个篮筐是第二个篮筐。所以,我们跳过第二个,去掉第四个,只留下第二个,这是我们的最后一个篮筐。您的解决方案只是删除所有的奇数苹果,这只是第一步。我们仍然需要跳过每一个篮筐,继续绕圈子。哇。。。所以基本上,我的错误是认为我只需要做一次这个过程,即去掉奇数,跳过剩下的偶数,直到我到达最后一个篮子。换句话说,这不仅仅是奇数对偶数,而是应用正确的迭代模式。我说得对吗?是的,没错。有趣的是,这个模式实际上可以简化为一个非迭代语句,但是正确的迭代模式比反推公式更有趣。不确定“但是正确的迭代模式比反推公式更有趣”是什么意思。如果你能提供一个简单的例子来说明你的意思,我会非常感激的。非常棒的工作!你认为我对这段代码有点了解吗:var lastApple=function(){while(allApples.length>1){for(I=0;i1){allApples.splice(I,1);}else{console.log(allApples.length);allApples.length=0;}};你很接近,但做得太多了。下面是代码的简化版本,它实现了相同(错误)的结果:问题是循环总是删除第一(0)项。你需要一种方法来决定是否跳过或删除第一项。嗯,但我认为应该根据挑战的这句话删除第一项:“最终,篮子1中的苹果将被删除,但篮子2中的苹果将被跳过。然后篮子3中的苹果将被删除。”篮子1===元素0不是吗?如果我去掉那个元素,剩下的另一个元素将在数组中占据那个位置,对吗?这里是你提供的简化代码的一个修改版本:结果是82。。。还错吗?我不同意。“这将继续(绕圆圈移动,从篮子中取出一个苹果,跳过下一个),直到篮子中只剩下一个苹果。”篮子在一个圆圈中。从第100篮到第1篮的过渡没有意义,也不应该中断苹果的移除过程。那么,它会产生什么结果呢?最后一个篮子是什么?我在下面的一个答案上发布的最后一个代码中得到了93,但我不确定它是否正确,我得到了72。这是干什么用的?我刚刚修改了我的代码得到了82。。。怎么想?我将再次编辑我的问题并发布我的代码。这是为了提高我的编码技能而进行的一些课程工作。