数据结构要考试了,这学期老师主要通过让我们stl的使用以及自学典型算法刷ACM水题来提高。

系列一记录ACM题中数据的读写问题。

##0X00
对于输入:

  • 如果输入数据全部有普通的数组成,可以直接用cin >> Intnum;
  • 或者 scanf(“%d”, &Intnum);
  • 注意 scanf(“lld”, &Doublenum);

输出问题:

设置域宽:
1. <iomanip>
cout << right << setw(4) << Intnum; //设置域宽为4,默认右对齐
cout << left << setw(4) << Intnum;  //左对齐

2. <cstdio>
printf("%4d", Intnum);  //默认右对齐
printf("%04d", Intnum); //用0填充

设置小数位数:
1. <iomanip>
cout << setprecision(4) << Doublenum;               //保留4位有效数字
cout << fixed << setprecision(4) << Doublenum;      //小数点后保留4位小数
cout << scientific << setprecision(4) << Doublenum; //科学计数法保留4位小数

2. <cstdio>
printf("%.4f",Doublenum);   //小数点后保留4位小数

##0X01
有时候需要把输入的一部分作为字符串处理

1. <string>
cin >> str;

解释:cin 对 string 的处理是,从第一个输入开始,看到空白符(空格,回车)都不管,等待有效输入,
有效输入完了,看到接下来的空白符,就把前面的有效输入当做一个字符串。
也就是说,str不会读空行,不会是空串。参考链接

2. string类中常用的几个函数
string::string
string::clear
string::compare
string::empty
string::erase
string::find
string::length
string::substr

##0X02
有时需要将数据以行为单位读入,并将字符串截取

<sstream>
<string>
string str, sa, sb;
getline(cin, str);
istringstream ss(str);
ss >> sa >> sb;

//注意:getline()会读取一整行,所以str可能是空串
//str="aaa bb"
//sa="aaa", sb="bb"

##0X03
输入中如果出现普通数的下一行是字符串的情况, 要考虑换行符

###Test 1###
cin >> Intnum;
getline(cin, str);

//Input:
//1
//abc

//str = ""

###Test 2###
cin >> Intnum;
cin >> str;

//Input:
//1
//abc

//str = "abc"

如果需要吸取一个回车符,可以使用cin.ignore();

##0X04
对于需要读到文件末尾的情况,可以这样:

while(!cin.eof()){
    read...
}

同样,对于istreamstring ss(str)同样有:

while(!ss.eof()){
    ss>>sth...
}

##0X05
复杂的输入输出

待补充

重新学习了一些基本的绳结,记录在此。

##先锋结

先锋结是先锋攀爬时用来联系主绳和安全带的一种绳结。
先锋结实质上是一个基本8字结和一个反穿8字结。

###基本8字结 Figure 8 Knot

基本8字结的作用:

  1. 作反穿8字结的基本结。
  2. 在攀岩保护和沿绳下降時结在绳子未端,防止绳子从保护器或下降器中溜走产生意外。

###反穿8字结 Figure 8 folow through (连接安全带)

注意:在完成反穿8字结后定要加个防脱结。

##单8字套 Single Figure 8 on a Bight

##双8字套 Figure 8 Double Loop

双8子套 动态图

##布林结

如何单手打布林结

##双套结 CloverHitch
先结一个圈

再结一个像小兔的耳朵

把两个圈叠起來,笫一个在笫二个上面,不要做错

把绳套扣入主锁里,便是双套结

双套结的作用是把绳子系在锁扣上,因为它有调较长短的功能,是经常用的结。
如你是领攀者或是跟攀者,到了保卫站,笫一个行动便是用双套结保卫自巳。
用了双套结,可随意根据活功笵围,调较绳子长短。

如何单手打双套结

图片中来自户外资料网

##0x00
刚开始接触CTF,于是先通过看别人写的writeup来学习。
第一篇先来个最简单的。

题目的地址在:这儿~~

一般出现图片的话,flag有很大几率藏在图片里面。

首先下载图片,载入十六进制编辑器,找到如下hex
23696E636C7564652066696C653D22386630306232303465393830303939382E70687022

将以上从十六进制解码到字符串为:include file=”8f00b204e9800998.php”

访问页面8f00b204e9800998.php,查看cookie,得到base64加密的key,如下
U0VjTDB2ZXJAMjAxNA

解密后得到key:SEcL0ver@2014

##0x01
每一道题都可以总结出很多东西。

  • 十六进制编辑器

  • 关于常见文件的文件头

    • JPEG (jpg),文件头:FFD8FF
    • PNG (png),文件头:89504E47
    • GIF (gif), 头文件:47494638
    • ZIP Archive (zip),文件头:504B0304
    • RAR Archive (rar),文件头:52617221
  • 在线16进制转字符串:http://www1.tc711.com/tool/BASE64.htm

  • base64编码:介绍, 加密解密

参考: 乌云知识库

Bellman-Ford 算法用来求一个顶点到其他顶点的最短路径,可以处理权值为负数的有向图,但图中不能含有负权回路。

##算法
Bellman-Ford 算法基于一种松弛操作,在不断松弛的过程中,源点到其他每个点的路径值逐渐地得到优化,并最终达到最佳的答案。算法的实质就是反复地(重复|V|-1次)松弛所有的边,最后就可以计算出单源最短路。算法的时间复杂度是O(|V|*|E|),其中 |V| 和 |E| 分别是图的顶点数和边数。

伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//参数:所有点的集合,所有边的集合,源点
function BellmanFord(list vertices, list edges, vertex source)
//需要的变量:
//(u,v)的权值 w
//数组weight[],源点到每个顶点的最短路
//数组predecessor[],在最短路中,每个顶点的前继

// Step 1: 对图进行初始化
for each vertex v in vertices:
if v is source then weight[v] := 0
else weight[v] := infinity
predecessor[v] := null

// Step 2: 不断松弛每条边,重复|V|-1次
for i from 1 to size(vertices)-1:
//下面松弛每一条边,可以使用二重循环处理
for each edge (u, v) with weight w in edges:
if weight[u] + w < weight[v]:
weight[v] := weight[u] + w
predecessor[v] := u

// Step 3: 检查是否有负权回路
for each edge (u, v) with weight w in edges:
if weight[u] + w < weight[v]:
error "Graph contains a negative-weight cycle"
return weight[], predecessor[]

简单地说,算法初始化源点的值为0,其他所有节点为无穷大,表示源点到它不可达。

然后对所有的边,如果源点到它的距离可以通过松弛操作缩短,那么距离就更新为新的较小的值。

在每一次(第i次)对所有边松弛操作的过程中,可以找到源点经过i个顶点到达其他顶点的最短路。

因为源点到任意顶点的路径最多经过(|V|-1)个顶点,所以,只要循环|V|-1次就可以计算出所有顶点的最短路。

最后需要判断是否含有负权回路,如果有,则提示无法计算最短路。

##证明
The correctness of the algorithm can be shown by induction. The precise statement shown by induction is:

Lemma. After i repetitions of for cycle:

If Distance(u) is not infinity, it is equal to the length of some path from s to u;
If there is a path from s to u with at most i edges, then Distance(u) is at most the length of the shortest path from s to u with at most i edges.
Proof. For the base case of induction, consider i=0 and the moment before for cycle is executed for the first time. Then, for the source vertex, source.distance = 0, which is correct. For other vertices u, u.distance = infinity, which is also correct because there is no path from source to u with 0 edges.

For the inductive case, we first prove the first part. Consider a moment when a vertex’s distance is updated by v.distance := u.distance + uv.weight. By inductive assumption, u.distance is the length of some path from source to u. Then u.distance + uv.weight is the length of the path from source to v that follows the path from source to u and then goes to v.

For the second part, consider the shortest path from source to u with at most i edges. Let v be the last vertex before u on this path. Then, the part of the path from source to v is the shortest path from source to v with at most i-1 edges. By inductive assumption, v.distance after i−1 cycles is at most the length of this path. Therefore, uv.weight + v.distance is at most the length of the path from s to u. In the ith cycle, u.distance gets compared with uv.weight + v.distance, and is set equal to it if uv.weight + v.distance was smaller. Therefore, after i cycles, u.distance is at most the length of the shortest path from source to u that uses at most i edges.

If there are no negative-weight cycles, then every shortest path visits each vertex at most once, so at step 3 no further improvements can be made. Conversely, suppose no improvement can be made. Then for any cycle with vertices v[0], …, v[k−1],

v[i].distance <= v[(i-1) mod k].distance + v[(i-1) mod k]v[i].weight

Summing around the cycle, the v[i].distance terms and the v[i−1 (mod k)] distance terms cancel, leaving

0 <= sum from 1 to k of v[i-1 (mod k)]v[i].weight

I.e., every cycle has nonnegative weight.

##检测负权回路

When the algorithm is used to find shortest paths, the existence of negative cycles is a problem, preventing the algorithm from finding a correct answer. However, since it terminates upon finding a negative cycle, the Bellman–Ford algorithm can be used for applications in which this is the target to be sought - for example in cycle-cancelling techniques in network flow analysis.

##在路由上的应用

A distributed variant of the Bellman–Ford algorithm is used in distance-vector routing protocols, for example the Routing Information Protocol (RIP). The algorithm is distributed because it involves a number of nodes (routers) within an Autonomous system, a collection of IP networks typically owned by an ISP. It consists of the following steps:

Each node calculates the distances between itself and all other nodes within the AS and stores this information as a table.
Each node sends its table to all neighboring nodes.
When a node receives distance tables from its neighbors, it calculates the shortest routes to all other nodes and updates its own table to reflect any changes.
The main disadvantages of the Bellman–Ford algorithm in this setting are as follows:

It does not scale well.
Changes in network topology are not reflected quickly since updates are spread node-by-node.
Count to infinity (if link or node failures render a node unreachable from some set of other nodes, those nodes may spend forever gradually increasing their estimates of the distance to it, and in the meantime there may be routing loops).

##参考
WIKI

###报名
一周前,记不清通过什么渠道知道了这么一场黑客马拉松的活动,当然也叫创客马拉松。活动大概是这么宣传的:两天时间内,报名参加的选手想一些 idea ,然后可以获得现场导师的帮助,再经过好多轮迭代最后完成项目,做出产品,或者是 demo 。主办方在 SJTU 承包了个食堂做场地,然后我和一个小伙伴就乐呵乐呵凑热闹去了。

###Day one
第一天中午开始,到了之后进一步了解到,直白的说,就是那么多人产生一些创意,然后自由组队,然后做项目。但是作为一个没有开发经验的小白,实在不知道怎么办了,于是就思考一下别人提供的点子,感觉没有十分合适的,就准备随意聊聊天回去了。开始之前,有几位嘉宾导师发言,讲了些设计模式之类的内容,要我们着眼于‘大局’,而不是某种语言某种技术。这点还是值得思考的。

了解了Codingkata的概念, Codingdojo(结对编程),等等

下午,我和小伙伴先是和另一个人A讨论了一个题目。A想要用gcc来编译一种gcc本身不能编译的语言,甚至是自创的语言。于是引出了很多问题,产生了争论,对,就是争论。

在我看来这就是写一个编译器呗,当然,我还不会写。我的小伙伴的想法是:把这个语言(比如D语言)的关键字使用 C 的宏替换成 C 的关键字,这样转换成的 C 程序,在调用gcc编译。我觉得这个想法不是很可行。需要考虑的东西比较多,或许学完编译原理好后直接就写个简单编译器即可。A 自己也没什么思路,最后不了了之。

一位导师倒是提供了一个信息:Ragel State Machine Compiler. 这个开源软件好像可以实现一些上述功能。这个也留着以后研究。

傍晚时分, 准备离开的时候,遇到了两个创客,交谈甚欢,产生了一些基于硬件的想法,最后决定做一个简单demo,并且取名 Health Cloud,然后可以衍生这个‘健康云’的应用场景,等等。交谈的过程中,知道了LiveCode这种用于快速开发的编程语言,并且能转化为任何平台的原生程序。不过确实小众。

###Dat two
经过合计约十五小时的现学现卖,查找资料以及努力调试,终于做成一个简单的 demo ,现记录下来,以便日后还原以及改进。

###Demo所用到的硬件和技术

  • PcDuino开发板
  • 温度传感器,光传感器,信号的采集
  • 接入互联网的wifi信号
  • 七牛云存储空间,API调用
  • 基于python的实现,使用matplotlib库绘图展示。

其中温度传感器得到的数据模拟体温,光传感器得到的数据模拟脉搏,每隔40ms采集数据各一个,每20s采集的500×2个数据作为一组,并打包成一个文本文件。

文本通过PcDuino上面编写的上传API程序(七牛云)上传到云端。然后,PC端使用API下载云端的文本文件,绘制心率折线图,计算平均温度,并且每个反复请求云端,当新的数据产生时,更新折线图。end

###需要注意的几点

  • 七牛云API规则的学习,可以直接使用官方的SDK(python)
  • 每隔一定的间隔时间,循环上传和下载信息,并更新曲线图。

###可以改进的方面

  • 采集更加准确精确的数据
  • 如果可行,直接将电压值处理后生成相应的脉搏次数
  • 信息在云端的存储规则,考虑断点上传等;
  • 数据是否可以实时传输,实时的绘制曲线,而非存在时间间隔
  • 如果不使用现有云平台,而是搭建服务器,该如何实现

###体会&其他
这次知道了原来有那么多的hackathon活动,认识了一些创客,创客团队,以及一些有想法的人。一位创客对我说,这次的比赛流程一点也不好,不是24小时,不能通宵,每个2小时介绍项目进度这样不好,宾馆偏僻等等问题。我们增长了见识,知识,宝贵经历经验。我们还知道了国内纽约大学的hackthon比赛,可惜无缘参加。

最后,值得一说的是,晚上在宾馆通宵的产出比白天还要高,可能是白天在研究各种技术细节把。本来想顺便玩一玩宾馆的无线网络的,最后也只是进入了电信的猫,仅仅知道了可能的路由拓扑结构,没什么意思。看来网络知识还欠缺,不能像乌云前辈那般潇洒了。

顺便记录一个网址,可以解出猫的登录密码,留存。

##目录

废话少说,直接干货。

##早点准备好自己的中英文简历

  • 我自己使用的是 mordencv 模板,正反面打印,分别介绍了自己的教育背景、专业学习、个人爱好、科研与实习经历、校内职务、校内奖励和语言水平,有新进展则更新;
  • 关于简历书写网上有很多的教诲,不再赘述,只想强调一点,要能自圆其说,写了但讲不明白是很尴尬的;
  • 不同的面试官关注点不同,有的侧重项目,有的侧重实习,还有的会问兴趣爱好,我的一个兴趣爱好 —— Mac 下的软件使用就曾被问及,这个跟技术也不沾边儿,不过能反映出我在某个方面确实动过脑子,也算是给面试官一个爱钻研的印象吧。

##准备一个靠谱的手机号和靠谱的手机

招聘季短信、电话的价值都是很高的,能否接到通知直接关乎申请的成败,不要觉得 HR 姐姐会执着的找你,候选人有的是,不差你这一个。

##复习职位相关知识点

仅以算法工程师(外加一点点软开)为例,需要准备的知识可能有

  • 程序语言基础,C++、Java 至少得熟一个吧;
  • 数据库;
  • 操作系统基础知识,如多线程;
  • 机器学习(模型、原理、适用场景与推导),大数据处理(主要是 hadoop);
  • 数据结构与算法;
  • 智力题,如一些概率问题。

我准备的主要途径是复习教材、跟踪系列分享以及重要知识点默记

  • 复习教材 每个人心中都有几本经典教材吧,不要畏难,先找一个下午把整本书翻完作为预热,然后找自己概念模糊的章节细读,个人经验来看,想要一章一章的把书看完,一般很难坚持到第三章的,这是大实话
  • 跟踪系列分享 比如白话经典算法结构之法算法之道 以及 The Art of Programming,这类资源实用性很强;
  • 重要知识点默记 我自己准备了一个精美的硬壳本(精美是重点,破纸早扔了),每一页记录的是基础的、重要的算法代码与模型推导,每隔几天或每当重要面试前自我抽查、默写。

##准备自我介绍,回顾项目与实习经历

  • 自我介绍是必备的,不要觉得自己都写在简历上了你就看呗,求职的是你自己,面试官没有义务去做阅读理解;一个流畅并略带特色(可以体现幽默、博学、阳光等)的自我介绍,一方面可以给面试官好的第一印象,还可以将面试官引导到你希望他考察你的地方,比如你可以强调引以为豪的项目,也可以强调某种算法模型,而这个模型其实你已经在复习知识点的时候研究得很透彻了;
  • 对于自己做过的项目与实习,由于时间久远或者表达能力上的欠缺,你未必能保证给面试官介绍得通透,所以,还是花点时间回顾并书面化为好,每次面试都能用得上。

##及时查阅收件箱与垃圾邮箱,对重要邮件做标记或打 tag,方便处理与查找

学校宣讲会的通知,重要材料的填写,笔试、面试通知(可能包含确认链接),等等,多了就可能遗忘,自己就曾让一封英语测试邮件睡了十天,要么新注册一个邮箱专门用于求职,要么每当看到重要邮件就做标记或打tag,逐个处理完成后再消除标记。

##暑期实习,把握内推机会

如果有暑期实习的机会,请尽可能按照找工作的标准争取,主要有以下五方面好处

  • 面试能力大练兵;
  • 暑假过得充实,与求职季完美衔接;
  • 公司前辈都能分享求职经验,甚至帮你内推其它公司;
  • 可以获得实习转正机会;
  • 拿到别的公司的实习机会但没有去,也可能入选该公司的提前批面试。

##笔试、面试结束后马上回忆题目,回到学校后查缺补漏

  • 对于参加过的笔试、面试,自己都有详细的记录与分析,确实能在这个过程中感受自身的能力提升,会在之后的博文中与大家分享;
  • 求职季每天记录求职笔记,包括今天申请了什么公司、接到了什么通知、学习/复习了什么知识、与谁有过讨论、笔试/面试感受如何等等,效果嘛,谁用谁知道,最起码现在写博客做分享的素材是不愁的。

##和同学朋友结伴申请

找一个对子或者建立一个小组,互相分享感兴趣的职位信息,这样做的好处是

  • 大家的申请进度互为参照,比如我没有收到笔试通知且伙伴也没有收到笔试通知,这很可能是正常现象,我没有收到但伙伴收到了,那就是哪里出问题了;
  • 信息整合,各取所需;
  • 面试经验可共享。

##总结

总的来说,求职季是对脑力、体力的双重考验,如果能在这个过程里边求职边思考,相信经过一个求职季的历练,你一定会有大过 offer 的感悟与收获。

接下来,我将从以下四方面分享一下自己的面试总结,欢迎持续关注。

  1. 智力题
  2. 编程语言
  3. 数据结构与算法
  4. 机器学习,大数据

原文地址: [http://frank19900731.github.io/blog/2014/10/25/qiu-zhi-ji-de-yi-dian-jing-yan-zhi-tan/]
作者 Frank Song 发布于 [http://frank19900731.github.io] 转载请注明

使用Hexo以后,发现加载速度很慢很慢。

搜索了一番,问题定位在:默认模板引用了google的jQuary和font文件。在Qiang内自然就慢了。

大致有两个解决方法:

  1. 改变文件引用的地址,改到大陆的免费地址。

  2. 下载文件到本地,从本地引用。

1
2
3
4
5
6
7
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
改为:
<script src="//libs.baidu.com/jquery/2.0.3/jquery.min.js"></script>

<link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
改为:
<link href="//fonts.useso.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">

参考一 参考二

晚上Anjuke校招宣讲会,虽然离毕业还很早,不过想到以前看到的种种笔经面经,还是忍不住去看看。

笔试开始,6题,40分钟。写完就无奈了,估计能对两道半,简单记录下。

  1. 问github和stackoverflow是什么网站,呵呵,so easy

  2. 网络的知识:172.16.0.1/16 ,然后问子网掩码和广播地址

  3. SQL: 两个表,一个是书的购买数,一个是书的价格。用一条语句把购买数前十的书的价格×2

  4. C语言知识,但是考到了fork(),现在还不懂,以后来填坑了。

  5. 简单的一个写程序,不知道该怎么描述灬

  6. 大概的题意是:假设小浣熊随机赠送的卡片共有 b 种(出现概率相同),那么集齐所有卡片所需购买小浣熊包数的数学期望是多少?这里有很多答案,但就是看不懂。等学了概率论再来理解。

1
2
3
4
5
6
7
8
9
10
11
12
13
//Number 4
#include <stdio.h>
#include <unistd.h>
int main(){
int i;
for (i=0; i<2; i++){
fork();
printf("-");
fflush(stdout);
}
return 0;
}
//问输出几个“-”?

过段时间来填坑。

linux环境下的virtualbox有两个版本:开源版本以及闭源版本。

从openSUSE软件仓库安装的是OES开源版本,这个版本中,虚拟机是不能访问物理usb设备的,即使安装了扩展包也不行。

解决方法

  1. 完全卸载原版本的virtualbox(必须)
  2. 从官网下载rpm包
  3. 安装:rpm -ivh *.rpm
  4. 从官网下载扩展包
  5. 打开virtualbox管理器,[Ctrl-G] , 在扩展栏安装扩展包(需root密码)

到这里就OK了!

如果不删除原版本,而是覆盖安装新版本。
那么启动虚拟机时会报错。

Unable to load R3 module /usr/lib/virtualbox/VBoxDD.so (VBoxDD): /usr/lib/virtualbox/VBoxDD.so: undefined symbol: VDGetSectorSize (VERR_FILE_NOT_FOUND).

最后,rpm包和扩展包官方下载地址