你的位置:首页 > Java教程

[Java教程]那些说自己逻辑好的,过来切磋下啊


今天在微信朋友圈里看到了这样一条信息:

100只狗排成一行,分别以1、2、3……编号,从这些狗中选出偶数号的杀掉,剩下的狗重新从1开始编号,然后再选偶数杀掉……如此循环直到只剩下1只狗为止。
请问这只狗要站在哪个位置才能保证存活时间最长(除了1号)?          


起初,觉得这个很简单,在本子上随便傻瓜式的排列下,然后一个个排除就不行了嘛,然后又想了想,假如1000只,10000只呢???你这样傻瓜式是可以,但是,你这不是浪费时间吗?
 
然后,我就开始coding了,设想有100只狗,那么,我就把这100只狗放在数组里面,然后,再循环这个数组的长度,为偶数的不做处理,不为偶数的,我们放在一个临时的笼子里面,去除的时候,不可能只去除一次,所以,要do,while循环。
 
下面给大家展示两种写法,一个是C#的,一个是JS的
 
C#写法:
  static void Main(string[] args)  {    //待去除狗的笼子    int[] dogs = new int[100];    //临时笼子    List<int> tempdogs = new List<int> { };    //100只狗,从1开始编号    for(int i=0;i<100;i++)    {      dogs[i] = i + 1;    }    //去除轮数    int kill = 0;    do    {      kill++;      for (int k = 0; k < dogs.Length; k++)      {        if ((k + 1) % 2 != 0)        {          tempdogs.Add(dogs[k]);        }      }      dogs = tempdogs.ToArray();      tempdogs.Clear();    } while (dogs.Length > 2);    {      Console.WriteLine("截止到第"+kill+"轮,仍然存活的两只狗是:"+dogs[0]+","+dogs[1]);    }  }

结果:

 

js写法:

  window.onload = function () {      killdog();    }       function killdog() {      var arr = [];//临时笼子      var dogs = [];//100只现成的狗      for (var i = 0; i < 100; i++) {        dogs[i] = i + 1;      }      do {        for (var j = 0; j < dogs.length; j++) {          //偶数的干掉          if ((j + 1) % 2 != 0) {            arr.push(dogs[j]);          }        }        dogs = arr;//把临时存储的再次放入狗笼子里面        arr = [];//必须清除之前被干掉的狗      } while (dogs.length > 2)      {        document.write("剩余狗的编号为:"+dogs);      }    }

  结果为:

 

以上就是我个人写得两种方法,可能写得不是太好,如果哪位大神能有更好的写法或者逻辑更好的来展现,请大神多多赐教,贴出代码,大家一起讨论下,可以是java,php,C++也可以是其他语言,总之,你有什么好的写法,麻烦呈现下,大家一起学习嘛!

 

好了,今天闲来无事,就写到这,你还在等什么,开启电脑,写个呀