刷题-任务调度Go语言 题目描述: 给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。
然而,两个相同种类的任务之间必须有长度为 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。
你需要计算完成所有任务所需要的最短时间。
示例:
输入: tasks = [“A”,“A”,“A”,“B”,“B”,“B”], n = 2 输出: 8 执行顺序: A -> B -> (待命) -> A -> B -> (待命) -> A -> B.
解题思路: 找出出现频率最高的任务频率计为maxchar,则最少时间为(maxchar-1)*(n + 1)+ 1; 例如:A -> X -> X -> A -> X -> X -> A 若出现利率最高的任务有多个,计为counter,则时间为(maxChar-1)*(n+1) + counter 如果计算出来的值比数组容量小,则返回数组容量值 代码: func leastInterval(tasks []byte, n int) int { charslice := [26]int{} maxChar := 0 counter := 0 if n == 0 { return len(tasks) } for i := 0; i < len(tasks); i++ { charslice[tasks[i]-'A']++ if maxChar < charslice[tasks[i]-'A'] { maxChar = charslice[tasks[i]-'A'] counter = 1 } else if maxChar == charslice[tasks[i]-'A'] { counter++ } } if (maxChar-1)*(n+1)+counter < len(tasks) { return len(tasks) } return (maxChar-1)*(n+1) + counter }
队列的链式存储结构 先上代码: #ifndef _QUEUE_H_#define _QUEUE_H_ #include <stdio.h>#include <stdlib.h> typedef int QElemType; typedef struct QNode { QElemType data; struct QNode* next; }QNode; typedef struct QNode* QueuePtr; typedef struct { QueuePtr fronter,rearer; }LinkQueue; void CreatQueue(LinkQueue* Q); int EnQueue(LinkQueue* Q,QElemType e); int DeQueue(LinkQueue* Q,QElemType* e); int ClearQueue(LinkQueue* Q); void TraveQueue(LinkQueue* Q); #endif // _QUEUE_H_ #include "queue.h" void CreatQueue(LinkQueue* Q) { QueuePtr q = (QueuePtr)malloc(sizeof(QNode)); q->data = 0;//存储列队长度 q->next = NULL; Q->fronter = q; Q->rearer = q; } int EnQueue(LinkQueue* Q,QElemType e) { QueuePtr q = (QueuePtr)malloc(sizeof(QNode)); q->data = e; q->next = NULL; Q->rearer->next = q; Q->rearer = Q->rearer->next; Q->fronter->data += 1; return 0; } int DeQueue(LinkQueue* Q,QElemType* e) { QueuePtr p; if(Q->fronter == Q->rearer) return -1; p = Q->fronter->next; *e = p->data; Q->fronter->next = p->next; if(Q->rearer == p)//若队头是队尾 Q->rearer = Q->fronter; free(p); Q->fronter->data -= 1; return 0; } int ClearQueue(LinkQueue* Q) { QueuePtr p,q; Q->rearer = NULL; p = Q->fronter; while(p) { q = p->next; free(p); p = q; } Q->fronter = NULL; printf("Queue is clear!
刷题-栈1 (C语言) 题目描述: 给定一个只包括 ‘(',')','{','}','[',']’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 示例 1: 输入: “()” 输出: true
示例 2: 输入: “()[]{}” 输出: true
示例 3: 输入: “(]” 输出: false
示例 4: 输入: “([)]” 输出: false
示例 5: 输入: “{[]}” 输出: true
解题思想: 根据字符串的长度建立一个顺序存储结构的栈 逐一读取字符串中的字符,只要是左括号都压入栈内 若遇到右括号则与栈顶元素相比较,若不匹配则返回false,若匹配,则出栈栈顶左括号,继续读取字符 最后返回栈顶序号的取反值:若还有左括号在栈中即为false,若栈为空为true 代码: bool isValid(char * s){ int top = 0; int i; char* p = (char*)malloc(strlen(s) + 1); for(i = 0;i < strlen(s);i++) { if((s[i] == '(') || (s[i] == '[') || (s[i] == '{')){ p[top++] = s[i]; } else{ if((--top) < 0)//top先减一,指向栈顶元素 return false; if(s[i] == ')' && p[top] !