算法题-每日气温

每日气温

根据每日气温列表,请从新生成一个列表,对应位置的输入是你须要再等待多久,温度才会升高超过该日的天数。若是以后都不会升高,请在该位置0来代替。例如,给定一个列表temperatures=[73,74,75,71,69,72,76,73],你的输出应该是[1,1,4,2,1,1,0,0]。提示:气温列表长度的范围是[1,30000]。每一个气温的值的均为华氏度,都是在[30,100]范围内的整数。

已知条件解析

  1. 数值进进出出,要有两个值的比较,一般用栈思想解决
  2. 试试用栈来解决
  • 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入栈...
  • ...

思路

  1. 使用顺序栈的方式-由于题目给的条件数组个数很少,用顺序结构要比链式结构简单
  2. struct结点元素能够增长index成员变量,用来记录在数组中的位置
  3. 输出结果能够是数组,能够初始化为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;
}
复制代码

运行

传送门

算法题-字符串编码算法

相关文章
相关标签/搜索