分类 学习记录 下的文章

大数据时代,数据无价

我最近研究了了qq空间的模拟登陆,程序拿到权限之后可以“为所欲为”。

想了想可以实现的玩法,欢迎补充。

理论可以实现的功能如下:

获取自己的说说列表
获取好友的说说列表
说说的点赞和评论情况
以及一些自然人刷空间可以获取到的所有信息

普通点的玩法:

  • 批量自动点赞评论
  • 尝试访问所有好友空间,可以知道有哪些好友对自己锁了空间

高级点的大数据玩法:

  • 分析近段时间好友关注热点(对说说内容进行分词、统计关键词热度)
  • 获取所有说说的评论列表和点赞列表,构建关系网络图像。可以有限的还原社交圈。
  • 订阅某人的说说(进行语义分析,分析文字情感值,绘制情绪曲线)
  • 识别说说中图片,有人脸则下载(自动下载空间里好友的自拍照片)
  • 统计分析好友作息规律,绘制曲线图
  • 统计分析好友使用的手机,综合年龄等数据,有限还原生活水平

理论上以上内容都可以完成,开发难度大小而已。

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

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;
}

 

配置过程参考逼乎https://www.zhihu.com/question/30315894,一步一步模仿,虽然看起来繁琐,其实非常简单。虽然现在要在终端把活动代码页改成65001才能正常的显示中文,命令:chcp 65001

每次打开终端就打这个命令有点麻烦,不过平时需要输出中文的情况并不多,所以就不去注册表改来改去了。

顺便看了下了PowerShell的使用,有类似Linux的命令,非常方便。比如rm ./*.exe可以瞬间删除目录下所有exe文件。用Get-Alias rm可以看到rm只是Remove-Item的别名,我一开始还以为内置Linux终端……

随便写个hahaha.c嗯……很棒