Arrays 循环队列算法问题

Arrays 循环队列算法问题,arrays,algorithm,Arrays,Algorithm,我正在尝试执行以下操作,但不知道如何在不崩溃或无限循环的情况下准确执行: 我必须创建一个队列,在该队列中,我必须以不同的次数分配不同的任务,或者使用此类信息: 任务X:[NextOne,LastOne] 任务1:[30,32] 任务2:[76,81] 任务3:[2,2] 任务4:[5,8] 这意味着“任务X”将被设置为“LastOne-NextOne”次,如果两者相等,则不会排队,它们将按X顺序进入队列。 在本例中,队列应如下所示: FIRST Task1[30] Task2[76] T

我正在尝试执行以下操作,但不知道如何在不崩溃或无限循环的情况下准确执行:

我必须创建一个队列,在该队列中,我必须以不同的次数分配不同的任务,或者使用此类信息:

  • 任务X:[NextOne,LastOne]

    • 任务1:[30,32]
    • 任务2:[76,81]
    • 任务3:[2,2]
    • 任务4:[5,8]
这意味着“任务X”将被设置为“LastOne-NextOne”次,如果两者相等,则不会排队,它们将按X顺序进入队列。 在本例中,队列应如下所示:

FIRST
Task1[30]
Task2[76]
Task4[5]
Task1[31]
Task2[77]
Task4[6]
Task1[32]
Task2[78]
Task4[7]
Task2[79]
Task4[8]
Task2[80]
Task2[81]
LAST
这不是一个语言问题,更多的是一个算法问题。使用PHP,我做了以下工作:

$tasks = array(
'Task1' => array(30,32),
'Task2' => array(76,81),
'Task3' => array(2,2),
'Task4' => array(5,8)
);


$aux = array();
$i=0;
foreach($tasks as $s=>$n) {
    $aux[$i]['task'] = $s;
    $aux[$i]['times'] = $n[1]-$n[0];
    $aux[$i]['first'] = $n[0];
    $i++;
}

但是,正如你想象的那样,这实际上没有任何作用,只是改变了信息的形状。我真的被困在这里,我不知道为什么,这其实不难理解。非常感谢您的帮助。

我想您可以使用
$s
作为散列(或等效数组)的键,只要遇到具有相同键的元素时,将值增加1即可。在这种情况下,默认值为0

比如说,

Task1=>数组(30,32)

会按顺序来的

Task1[30] (default value to 0)
...
...
Task1[31] (add 1 which becomes 1)
...
Task1[32] (add 1 which becomes 2)
这意味着Task1总共出现了3次,最终的
次数
值应为2

我想你可以使用
array\u key\u exists
helper函数来检查某个任务之前是否出现过

在python中(我可能误解了您的“这不是语言问题”评论-请原谅):

很抱歉,它不是用php编写的-这不是我的专长,但也许这会有所帮助?输出:

Task1 30
Task2 76
Task3 2
Task4 5
Task1 31
Task2 77
Task4 6
Task1 32
Task2 78
Task4 7
Task2 79
Task4 8
Task2 80
Task2 81
用C#

结果如你所愿

我添加了一个数字作为标志:1=不排队,2=任务的最后一条记录

效率不高但有效

private static void Main()
{
    var tasks = new Dictionary<string, int[]>
                    {
                        {"Task1", new[] {30, 32, 0}},
                        {"Task2", new[] {76, 81, 0}},
                        {"Task3", new[] {2, 2, 0}},
                        {"Task4", new[] {5, 8, 0}}
                    };
    int loopCounter = 0;
    Console.WriteLine("FIRST");
    while (loopCounter < tasks.Count)
    {
        foreach (var task in tasks)
        {
            if (task.Value[0] == task.Value[1])
            {
                if (task.Value[2] == 2)
                {
                    loopCounter++;
                    Console.WriteLine(task.Key + "[" + task.Value[0] + "]");
                    task.Value[2] = 1;
                }
                else if (task.Value[2] == 0)
                {
                    loopCounter++;
                    task.Value[2] = 1;
                }
            }
            else
            {
                Console.WriteLine(task.Key + "[" + task.Value[0] + "]");
                task.Value[0]++;
                if (task.Value[0] == task.Value[1])
                    task.Value[2] = 2;
            }
        }
    }
    Console.WriteLine("LAST");
    Console.ReadLine();
}

希望这有帮助。

谢谢,这非常有帮助。在Python中,这没问题,谢谢。
private static void Main()
{
    var tasks = new Dictionary<string, int[]>
                    {
                        {"Task1", new[] {30, 32, 0}},
                        {"Task2", new[] {76, 81, 0}},
                        {"Task3", new[] {2, 2, 0}},
                        {"Task4", new[] {5, 8, 0}}
                    };
    int loopCounter = 0;
    Console.WriteLine("FIRST");
    while (loopCounter < tasks.Count)
    {
        foreach (var task in tasks)
        {
            if (task.Value[0] == task.Value[1])
            {
                if (task.Value[2] == 2)
                {
                    loopCounter++;
                    Console.WriteLine(task.Key + "[" + task.Value[0] + "]");
                    task.Value[2] = 1;
                }
                else if (task.Value[2] == 0)
                {
                    loopCounter++;
                    task.Value[2] = 1;
                }
            }
            else
            {
                Console.WriteLine(task.Key + "[" + task.Value[0] + "]");
                task.Value[0]++;
                if (task.Value[0] == task.Value[1])
                    task.Value[2] = 2;
            }
        }
    }
    Console.WriteLine("LAST");
    Console.ReadLine();
}
FIRST
Task1[30]
Task2[76]
Task4[5]
Task1[31]
Task2[77]
Task4[6]
Task1[32]
Task2[78]
Task4[7]
Task2[79]
Task4[8]
Task2[80]
Task2[81]
LAST