每日气温
根据每日气温列表,请从新生成一个列表,对应位置的输入是你须要再等待多久,温度才会升高超过该日的天数。若是以后都不会升高,请在该位置0来代替。例如,给定一个列表temperatures=[73,74,75,71,69,72,76,73],你的输出应该是[1,1,4,2,1,1,0,0]。提示:气温列表长度的范围是[1,30000]。每一个气温的值的均为华氏度,都是在[30,100]范围内的整数。
已知条件解析
- 数值进进出出,要有两个值的比较,一般用栈思想解决
- 试试用栈来解决
- 73入栈,栈顶元素为73,74与栈顶73比较,知足条件 73出栈
- 74入栈,栈顶元素为74,75与栈顶74比较,知足条件 74出栈
- 75入栈,栈顶元素为75,71与栈顶75比较,不知足
- 71入栈,栈顶元素为71,69与栈顶71比较,不知足
- 69入栈,栈顶元素为69,72与栈顶69比较,知足条件 69出栈
- 栈顶元素71,72与栈顶71比较,知足条件 71出栈
- 栈顶元素75,72与75比较,不知足,
- 72入栈...
- ...
思路
- 使用顺序栈的方式-由于题目给的条件数组个数很少,用顺序结构要比链式结构简单
- struct结点元素能够增长index成员变量,用来记录在数组中的位置
- 输出结果能够是数组,能够初始化为0
代码
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 8
typedef int Status;
typedef int ElemType;
typedef struct Node{
ElemType elem;
int index;//位置
}Node, *NodePtr;
typedef struct stack{
Node data[MAXSIZE];
int top;
}Stack;
Status initSqStack(Stack *S) {
S->top = -1;
return OK;
}
Status push(Stack *S, Node e) {
S->data[S->top + 1] = e;
S->top++;
return OK;
}
Status pop(Stack *S, Node *e) {
*e = S->data[S->top];
S->top --;
return OK;
}
void getTemperaturesUpperDays(int *arr, int *ret) {
//初始化 栈
Stack st;
initSqStack(&st);
int i = 0;
//用数组的第0个元素 建立一个结点
Node top;
top.elem = arr[i];
top.index = i;
//入栈
push(&st, top);
//遍历后面的数组元素
for (i = 1; i < sizeof(arr); i++) {
//(当前for循环的数组元素 > 栈顶元素) && 栈中有元素
while (arr[i] > top.elem && st.top != -1) {
//出栈
Node temp;
pop(&st, &temp);
//以出栈元素中index变量为返回数组中的位置,算i与index的差值
ret[temp.index] = i - temp.index;
//获取top结点
top = st.data[st.top];
}
//将当前的数组结点入栈
top.elem = arr[i];
top.index = i;
push(&st, top);
}
}
int main(int argc, const char * argv[]) {
// insert code here...
printf("Hello, World!\n");
int temperatures[8] = {73,74,75,71,69,72,76,73};
int ret[8]= {0,0,0,0,0,0,0,0};
getTemperaturesUpperDays(temperatures, ret);
for (int i = 0; i < 8; i++) {
printf("%d ", ret[i]);
}
printf("\n");
return 0;
}
复制代码
运行
传送门
算法题-字符串编码算法