帮学校迎新晚会做了个上墙的应用。

AF8A83EB-8DFA-464B-855B-D9BCACC82417.png

现在有个问题就是用户一个提交之后,后端需要请求两三个外部接口来过滤垃圾信息,然后返回提交成功。第三方接口造成的时间开销太大!用户需要等四五秒才能看到提交成功。

优化方案是使用消息队列(任务队列):用户提交后存入数据库、内存或者文件上的一个队列,然后另一个进程去监控这个队列,发现有更新后去执行一些操作比如过滤什么的,然后将结果存入数据库。

有点像本博客的邮件评论系统,但是评论系统时效性不高,所以使用的是三十分钟一次的计划任务。而一个上墙应用不可能让用户等待那么久才看到自己的发言。用秒级的计划任务明显不现实,所以需要一个监控进程。

但是这涉及到PHP的异步操作,方面网上资料好难找啊。而且使用消息队列的项目都是非常大的数据量,资料中什么读写分离负载和均衡之类的,有点大材小用的感觉。学习成本有点高。

现在想到个折中的办法就是前端分割请求,后端分步骤处理数据。先ajax请求一个接口进行关键字省察,后端返回结果,前端显示关键字省察成功。然后ajax下一个请求……

这个的好处就是用户不会对着“提交中”三个字干等。缺点也很明显,会产生更多的请求。

括号配对问题

时间限制: 3000 ms  |  内存限制: 65535 KB
难度:3

描述

现在,有一行括号序列,请你检查这行括号是否配对。

输入

第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", "]", "(", ")" 四种字符

输出

每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No

样例输入

3
[(])
(])
([[]()])

样例输出

No
No
Yes

来源网络

上传者naonao

解题思路

用了栈的思想,后进后出。读取一个括号,如果与栈尾配对,则栈尾出栈,否则入栈。

代码

#include &lt;stdio.h&gt;
#define Max 10000
int main()
{
    int n;
    scanf("%d", &n);
    while (n > 0)
    {
        char s[Max], t[Max];
        //printf("%d inpot=", n);//debug
        scanf("%s", s);
        int j = 0, i = 0;
        //printf("pdstart\n");//debug
        while (s[i] != '\0')
        {
            t[j] = s[i]; //入栈
            //printf("j=%d\t", j);//debug
            t[j + 1] = '\0'; //关闭
            //打印配对前栈
            //printf("t=%s\t", t);//debug
            //配对
            if ((t[j] == ']' && t[j - 1] == '[') || (t[j] == ')' && t[j - 1] == '('))
            {
                j = j - 1;
                t[j] = '\0'; //出栈
                //printf("j=%d\t->\t", j);//debug
            }
            else
            {
                j++;
                //printf("j=%d\t--\t", j);//debug
            }
            i++;
            //打印配对后栈
            //printf("t=%s\n", t);//debug
        }
        if (t[0] == '\0')
        {
            printf("Yes\n");
        }
        else
        {
            printf("No\n");
        }
        //printf("pdend\n");//debug
        n--;
    }
    return 0;
}

描述
小明十分聪明,而且十分擅长排列计算。比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长。现在需要你写一个程序来验证擅长排列的小明到底对不对。
输入
第一行输入整数N(1<N<10)表示多少组测试数据,
每组测试数据第一行两个整数 n m (1<n<9,0<m<=n)
输出
在1-n中选取m个字符进行全排列,按字典序全部输出,每种排列占一行,每组数据间不需分界。如样例
样例输入
2
3 1
4 2
样例输出
1
2
3
12
13
14
21
23
24
31
32
34
41
42
43


 解题笔记

说实话我刚刚看到全排序几个字的时候有点懵逼,后来才想起好像数学老师讲过……言归正传第一个想到的算法是冒泡排序,完全冒泡一遍不就是一个全排列吗!但是貌似和题意不符……貌似应该是一个深度优先算法。总之先搭个框架然后再去温习下算法书233

#include <stdio.h> 
int main()
{
    int n, a, b;
    scanf("%d", &n);
    getchar();
    for (n; n > 0; n--)
    {
        scanf("%d", &a);
        getchar();
        scanf("%d", &b);
        getchar();
        //开始排列

        //结束排列
    }
    return 0;
}