黑马程序员技术交流社区

标题: 从猴子报数想到的 [打印本页]

作者: 蔡嘉    时间: 2012-10-2 11:48
标题: 从猴子报数想到的
为什么用currentIndex与monkey.count来比较?monkey.RemoveAt()与monkey.Remove()有什么区别呢?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace monkey
{
    class Program
    {
//        //相传有一群猴子要选出大王,它们采用的方式为:所有猴子站成
//一个圈,然后从1开始报数,每当数到".
////"N的那一只猴子就出列,然后继续从下一个猴子开始又从1开始数,数
//到N的猴子继续出列,一直到最后".
////"剩的猴子就是大王了。 假如现在有M只猴子, 报数数为N, 请问第几只猴
//子是大王?列出选大王的过程。
        static void Main(string[] args)
        {
            int m = 10;
            int n = 3;
            List<string> monkey = new List<string>();
            for (int i = 1; i <= m; i++)
            {
                monkey.Add("m" + i);               
            
                //monkey.Remove(monkey[2]);
                //Console.WriteLine(monkey[i]);
            }
            //Console.Read();
            int currentIndex = 0;
            while (true)
            {
                for (int i = 1; i <= n; i++)
                {
                    if (i == n)
                    {
                        monkey.RemoveAt(currentIndex);
                        if (monkey.Count == 1)
                        {
                            Console.WriteLine(monkey[currentIndex]);
                            return;
                        }
                    }
                    currentIndex++;
                    if (currentIndex >= monkey.Count)
                    {
                        currentIndex = 0;
                    }
                }
            }

作者: 彭书雄    时间: 2012-10-2 14:07
currenIndex  是当前喊道指定数的索引值   如果索引值超过当前剩余猴子的数目就会出错,从而找不到最后一个猴子

remove(value)  是删除匹配值为value 的第一个匹配项
reomveat(index) 删除索引位置index 的项

你的程序有问题  mokey.removeat(currentIndex)  你第一次删除的永远是第1个猴子 删除的应该是 索引为2的猴子 也就是第三个猴子 应该将i-1赋值给currentIndex
作者: 蔡嘉    时间: 2012-10-2 14:24
彭书雄 发表于 2012-10-2 14:07
currenIndex  是当前喊道指定数的索引值   如果索引值超过当前剩余猴子的数目就会出错,从而找不到最后一个 ...

楼上同学,程序没问题,跑过了,currentIndex随 i 的值同步增长,直到发现currentIndex的值大于等于猴的数量,回到索引初始位置,也即monkey[0]。忽然想到索引位置从零开始,所以对currentIndex先做自增,这样就和猴的数相匹配了,而不是总差1。(为么用currentIndex与monkey.count来比较?)
另外,请注意currentIndex采用camel命名法,不是全小写的!

monkey.RemoveAt()与monkey.Remove()有什么区别呢?
remove(value)  是删除匹配值为value 的第一个匹配项
reomveat(index) 删除索引位置index 的项
上面的解释能否再详细点,最好举例说明,谢谢!



作者: 彭书雄    时间: 2012-10-2 14:29
本帖最后由 彭书雄 于 2012-10-2 14:43 编辑
蔡嘉 发表于 2012-10-2 14:24
楼上同学,程序没问题,跑过了,currentIndex随 i 的值同步增长,直到发现currentIndex的值大于等于猴的 ...
  1. List<string> array = new List<string>();
  2. array.add("a");
  3. array.add("b");
  4. array.add("c");

  5. 这个泛型队列
  6. 索引    值
  7. 0          "a"
  8. 1          "b"
  9. 2          "c"

  10. 如果执行array.reomve("b");
复制代码

作者: 蔡嘉    时间: 2012-10-2 14:39
彭书雄 发表于 2012-10-2 14:29

我研究一下。
作者: 彭书雄    时间: 2012-10-2 14:44
蔡嘉 发表于 2012-10-2 14:24
楼上同学,程序没问题,跑过了,currentIndex随 i 的值同步增长,直到发现currentIndex的值大于等于猴的 ...

List<string> array = new List<string>();
array.add("a");
array.add("b");
array.add("c");

这个泛型队列
索引    值
0          "a"
1          "b"
2          "c"

如果执行array.reomve("b");
Console.WriteLine(array[1])   输出的值就是"c"

如果执行array.removeAt(1)  
Console.WriteLine(arrat[1])  输出的值也是"c"

remove(value) 这个方法匹配的是值 如果找到值就删除第一个  如果找不到也不影响
removeAt(index)  这个方法的参数是索引  跟数组的索引一样 删除索引位置的值  如果找出索引值就会报错

为了分辨  就在At  At 可以理解为在哪的意思   在哪就用索引   

作者: 蔡嘉    时间: 2012-10-2 15:43
彭书雄 发表于 2012-10-2 14:44
蔡嘉 发表于 2012-10-2 14:24
楼上同学,程序没问题,跑过了,currentIndex随 i 的值同步增长,直到发现cu ...

谢谢!我考到vs里面跑一跑。
作者: 彭书雄    时间: 2012-10-2 15:53
蔡嘉 发表于 2012-10-2 15:43
谢谢!我考到vs里面跑一跑。

刚刚没看到i++ 我知道的  嘿嘿




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2