每日气温
根据每日气温列表,请重新生成一个列表,对应位置的输入是你需要再等待多久,温度才会升高超过该日的天数。如果之后都不会升高,请在该位置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;
Node top;
top.elem = arr[i];
top.index = i;
push(&st, top);
for (i = 1; i < sizeof(arr); i++) {
while (arr[i] > top.elem && st.top != -1) {
Node temp;
pop(&st, &temp);
ret[temp.index] = i - temp.index;
top = st.data[st.top];
}
top.elem = arr[i];
top.index = i;
push(&st, top);
}
}
int main(int argc, const char * argv[]) {
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;
}
运行
传送门
算法题-字符串编码