【问题标题】:How to get specific sequence of array given the array size and the beginning如何在给定数组大小和开头的情况下获取特定的数组序列
【发布时间】:2012-05-02 10:38:14
【问题描述】:

我有以下情况:

一个列表或数组。大小是我从用户那里得到的一个变量,介于 1 到 12 之间。

如果大小为 3,则数组 {1,2,3}

如果大小为 5,则数组 {1,2,3,4,5}

等等

现在开头也是一个变量。

我想得到的序列是:

如果大小为 12,例如开头为 9

我想要这个特定顺序的以下结果。

9,10,11,12,1,2,3,4,5,6,7,8

我的意思是我从给定的开头开始直到最后一项,然后如果开头不是1,那么我继续1直到开始。

我这样做了,但它特定于大小12

使用此代码:


        int[] arr = new int[12];
        int month = 9;//input from the user
        List<int> source = new List<int>();
        while (month <= 12)
        {
            source.Add(month);
            month++;
        }
        if (source.Count < 12)
        {
            for (int i = 1; i < source[0]; i++)
            {
                source.Add(i);
            }
        }

我想要更通用的解决方案来允许可变大小而不仅仅是12

【问题讨论】:

  • 你快接近了。第 1 行不需要数组变量。只需取一些 int 变量,例如 int lenght = 12。现在在 while 循环和 if 条件中将 12 替换为可变长度。编辑:您也可以从函数中输入长度,该函数返回 12 表示月数,30 或 31 表示天数,等等
  • 请在下面找到三个解决方案

标签: c# asp.net linq list loops


【解决方案1】:

我已经测试过了,它可以工作

                int arrsize = Convert.ToInt32(Console.ReadLine());
                int[] arr = new int[arrsize];
                int month = Convert.ToInt32(Console.ReadLine());//input from the user
                List<int> source = new List<int>();
                while (month <= arrsize)
                {
                    source.Add(month);
                    month++;
                }
                if (source.Count < arrsize)
                {
                    for (int i = 1; i < source[0]; i++)
                    {
                        source.Add(i);
                    }
                }
                foreach (int i in source)
                    Console.Write(i);

请添加一些条件,例如数组大小不应小于月份,并且用户始终输入整数并在 try catch 中执行此操作以获取良好实践...等

使用其他答案的一些逻辑后,我认为下面的代码要好得多。

                int arrsize = Convert.ToInt32(Console.ReadLine());
                int month = Convert.ToInt32(Console.ReadLine());//input from the user
                List<int> source = new List<int>();
                int temp = 0;
                for (int i = 0; i < arrsize; i++)
                {
                    temp = i + month;
                    if (temp != arrsize)
                        source.Add(((i + month) % arrsize));
                    else
                        source.Add(arrsize);
                }

第二种方法的复杂度较低,只有 O(n),因为它只使用一个循环而不是 2 个。

第三种解决方案更简单:)

                for (int i = 0; i < size; i++)
                {
                    if (i < month)
                        source.Add(i + month);
                    else
                        source.Add((i - month) + 1);
                }

希望对你有帮助。

【讨论】:

    【解决方案2】:

    这样的事情怎么样:

            static IEnumerable<int> GetSequence(int size, int beginning)
            {
              return Enumerable.Range(beginning, size).Select(i => 1 + (i - 1) % 12);
            }
    

    您可以将数字12更改为方法的第三个参数。

    【讨论】:

    • @just_name 是的,这是我们再次“环绕”为 1 的值。
    • 这是 12 的硬编码解决方案。他想要一个通用的。像%大小的东西。但我喜欢你的解决方案优雅而简单:)
    【解决方案3】:
    static int[] Sequence(int size, int start)
    {
        start--;
        int[] result = new int[size];
    
        for (int i = 0; i < size; i++)
        {
            result[i] = ((i + start) % size ) + 1;
        }
    
        return result;
    }
    

    【讨论】:

    • 您的正确代码是 int temp = 0; for (int i = 0; i
    • 原因是 12%12 将是 0 所以当 size 与 i + start 相同时你不需要做 %。
    • 我的代码产生了正确的结果。您的优化将模运算替换为赋值和 if 语句。我怀疑它是否能解释更优化或更正确的代码。
    • 是的,我的代码可能没有比您的代码优化...但是我已经运行了您的代码,如果您遵循问题作者的示例,它会给出不正确的结果。就这样。你的代码肯定是优化过的。
    • 谢谢。我认为这是 1-og 0 索引数组的问题。这当然不是借口:),但我测试并发现结果令人满意,因为我默认假设 0-indexes Sequence(12,0) 给出 [1:12],但你说得很对,它应该可能为 S(12,1) => [1:12]。所以最简单的解决方案可能是在 Sequence 方法中减少 start (编辑中就是这种情况)。
    猜你喜欢
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    相关资源
    最近更新 更多